如何使用PowerShell执行.sql文件?

我有一个 。 sql文件。 我想通过Powershell脚本传递连接string的细节,并调用一个.sql文件。

我正在search,并提出了一个与Invoke-sqlcmd相关的cmdlet。 当我试图find一个对应于SQL的模块时,我没有在我的机器上find任何一个模块。

我应该在我的机器上安装任何东西(机器已经有SQL Server Management Studio 2008 R2)来获取模块,或者有没有简单的方法来使用Powershell来执行.sql文件?

尝试查看SQLpipe理单元是否存在:

 get-pssnapin -Registered Name : SqlServerCmdletSnapin100 PSVersion : 2.0 Description : This is a PowerShell snap-in that includes various SQL Server cmdlets. Name : SqlServerProviderSnapin100 PSVersion : 2.0 Description : SQL Server Provider 

如果是这样

 Add-PSSnapin SqlServerCmdletSnapin100 # here lives Invoke-SqlCmd Add-PSSnapin SqlServerProviderSnapin100 

那么你可以做这样的事情:

 invoke-sqlcmd -inputfile "c:\mysqlfile.sql" -serverinstance "servername\serverinstance" -database "mydatabase" # the parameter -database can be omitted based on what your sql script does. 

从MSDN上导入SQLPS模块引用,

从PowerShellpipe理SQL Server的推荐方法是将sqlps模块导入到Windows PowerShell 2.0环境中。

所以,是的,您可以使用Christian详细介绍的Add-PSSnapin方法,但是了解推荐的sqlps模块方法也是有用的。

最简单的情况就是假设你有SQL Server 2012:安装中包含了sqlps ,所以你只需通过Import-Module sqlps加载模块(通常在你的configuration文件中 )。 你可以使用Get-Module -ListAvailable检查你的系统上的模块是否可用。

如果您没有SQL Server 2012,那么您只需要将sqlps模块下载到您的模块目录中,以便Get-Module / Import-Module可以find它。 奇怪的是,微软并没有让这个模块可供下载! 然而,乍得米勒慷慨地包装了必要的部分,并提供此模块下载 。 将其解压缩到您的… Documents \ WindowsPowerShell \ Modules目录下,然后继续导入。

有趣的是,模块方法和snapin方法并不完全相同。 如果你加载了pipe理单元然后运行Get-PSSnapin没有 -Registered参数,只显示你已经加载的),你会看到SQLpipe理单元。 另一方面,如果加载sqlps模块, Get-PSSnapin将不显示加载的pipe理单元,因此,通过仅检查pipe理单元来testingInvoke-Sqlcmd cmdlet的各种博客条目可能会给出错误的否定结果。

2012.10.06更新

有关sqlps模块与sqlps mini-shell与SQL Serverpipe理单元的完整故事,请参阅Simple-Talk.com上最近发表的针对SQL Server开发人员和DBA的两部分小型系列实用PowerShell根据一位读者的评论,我已经成功地将这个问题“解迷”了。 🙂

 if(Test-Path "C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS") { #Sql Server 2012 Import-Module SqlPs -DisableNameChecking C: # Switch back from SqlServer } else { #Sql Server 2008 Add-PSSnapin SqlServerCmdletSnapin100 # here live Invoke-SqlCmd } Invoke-Sqlcmd -InputFile "MySqlScript.sql" -ServerInstance "Database name" -ErrorAction 'Stop' -Verbose -QueryTimeout 1800 # 30min 

这是我在PowerShellconfiguration文件中加载SQLpipe理单元的一个函数:

 function Load-SQL-Server-Snap-Ins { try { $sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps" if (!(Test-Path $sqlpsreg -ErrorAction "SilentlyContinue")) { throw "SQL Server Powershell is not installed yet (part of SQLServer installation)." } $item = Get-ItemProperty $sqlpsreg $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path) $assemblyList = @( "Microsoft.SqlServer.Smo", "Microsoft.SqlServer.SmoExtended", "Microsoft.SqlServer.Dmf", "Microsoft.SqlServer.WmiEnum", "Microsoft.SqlServer.SqlWmiManagement", "Microsoft.SqlServer.ConnectionInfo ", "Microsoft.SqlServer.Management.RegisteredServers", "Microsoft.SqlServer.Management.Sdk.Sfc", "Microsoft.SqlServer.SqlEnum", "Microsoft.SqlServer.RegSvrEnum", "Microsoft.SqlServer.ServiceBrokerEnum", "Microsoft.SqlServer.ConnectionInfoExtended", "Microsoft.SqlServer.Management.Collector", "Microsoft.SqlServer.Management.CollectorEnum" ) foreach ($assembly in $assemblyList) { $assembly = [System.Reflection.Assembly]::LoadWithPartialName($assembly) if ($assembly -eq $null) { Write-Host "`t`t($MyInvocation.InvocationName): Could not load $assembly" } } Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0 Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30 Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000 Push-Location if ((Get-PSSnapin -Name SqlServerProviderSnapin100 -ErrorAction SilentlyContinue) -eq $null) { cd $sqlpsPath Add-PsSnapin SqlServerProviderSnapin100 -ErrorAction Stop Add-PsSnapin SqlServerCmdletSnapin100 -ErrorAction Stop Update-TypeData -PrependPath SQLProvider.Types.ps1xml Update-FormatData -PrependPath SQLProvider.Format.ps1xml } } catch { Write-Host "`t`t$($MyInvocation.InvocationName): $_" } finally { Pop-Location } } 

与2008年的服务器2008年和2008年R2

 Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100 

与2012年和2014年

 Push-Location Import-Module -Name SQLPS -DisableNameChecking Pop-Location