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

我有一个。sql文件。我尝试通过 Powershell 脚本传递连接字符串细节并调用 .sql文件。

我一直在搜索,找到了一个与 Invoke-sqlcmd相关的 cmdlet。当我试图找到一个对应于 SQL 的模块时,在我的机器中没有找到任何模块。

我应该在我的机器上安装任何东西(机器已经有 SQLServerManagementStudio2008R2)来获取模块,还是有任何简单的方法来使用 Powershell 执行 .sql文件?

143535 次浏览

Try to see if SQL snap-ins are present:

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 模块的话,

从 PowerShell 管理 SQLServer 的推荐方法是导入 将 sqlps 模块转换为 Windows PowerShell 2.0环境。

因此,是的,您可以使用 Christian 详细介绍的 Add-PSSnapin方法,但是欣赏推荐的 sqlps 模块方法也很有用。

最简单的情况假设您有 SQLServer2012: 火鸡包含在安装中,因此您可以像其他模块一样(通常在 侧写中)通过 Import-Module sqlps加载模块。您可以使用 Get-Module -ListAvailable检查模块是否在您的系统上可用。

如果您没有 SQL Server 2012,那么您所需要做的就是将 火鸡模块下载到您的模块目录中,这样 Get-Module/Import-Module 就会找到它。奇怪的是,微软的 没有使这个模块可供下载!然而,乍得米勒好心地包装了所需的零件并提供了 这个模块下载。将其解压到您的... ... DocumentWindowsPowerShell 模块目录下,然后继续导入。

值得注意的是,模块方法和管理单元方法并不完全相同。如果加载了管理单元,那么运行 Get-PSSnapin(没有 the-Register 参数,以仅显示已加载的内容) ,您将看到 SQL 管理单元。另一方面,如果加载 sqlps 模块 Get-PSSnapin将不会显示加载的管理单元,因此通过仅检查管理单元来测试 Invoke-Sqlcmd cmdlet 的各种博客条目可能会得到假阴性结果。

2012.10.06更新

关于 sqlps 模块与 sqlps mini-shell 与 SQL Server 管理单元的完整故事,请看我最近在 Simple-Talk.com 上发表的由两部分组成的迷你系列 为 SQLServer 开发人员和 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

下面是我在 PowerShell 配置文件中用于加载 SQL 管理单元的函数:

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

对于不需要额外工具/安装/PowerShell 附加组件的简单脚本,这里提供了一种轻量级方法。

$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = $connectionStringGoesHere
$conn.Open()
$content = Get-Content $scriptFileNameGoesHere
$cmds = New-Object System.Collections.ArrayList
$cmd = ""
$content | foreach {
if ($_.Trim() -eq "GO") { $cmds.Add($cmd); $cmd = "" }
else { $cmd =  $cmd + $_ +"`r`n" }
}
$cmds | foreach {
$sc = New-Object System.Data.SqlClient.SqlCommand
$sc.CommandText = $_
$sc.Connection = $conn
$sc.ExecuteNonQuery()
}

Invoke-Sqlcmd -Database MyDatabase -Query "exec dbo.sp_executesql N'$(Get-Content "c:\my.sql")'"