.sql
ファイルがあります。 Powershellスクリプトを介して接続文字列の詳細を渡し、.sql
ファイルを起動しようとしています。
検索していて、Invoke-sqlcmd
に関連するコマンドレットを思いつきました。 SQLに対応するモジュールを見つけようとしていましたが、マシンにモジュールが見つかりませんでした。
モジュールを取得するためにマシンに何かをインストールする必要がありますか(マシンには既にSQL Server Management Studio 2008 R2があります)、またはPowershellを使用して.sql
ファイルを実行する簡単な方法はありますか?
SQLスナップインが存在するかどうかを確認してください。
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からSQL Serverを管理する推奨方法は、sqlpsモジュールをWindows PowerShell 2.0環境にインポートすることです。
したがって、はい、Christianが詳述したAdd-PSSnapin
アプローチを使用できますが、推奨されるsqlpsモジュールアプローチを評価することも役立ちます。
最も単純なケースは、SQL Server 2012を使用していることを前提としています:sqlpsがインストールに含まれているため、他のモジュール(通常は profile )Import-Module sqlps
経由。 Get-Module -ListAvailable
を使用して、システムでモジュールが使用可能かどうかを確認できます。
SQL Server 2012がない場合は、Get-Module/Import-Moduleがモジュールディレクトリにsqlpsモジュールをダウンロードするだけです。それを見つける。不思議なことに、マイクロソフトはこのモジュールをダウンロードできるようにしましたnot!ただし、Chad Millerは必要な部分を親切にパッケージ化し、 このモジュールのダウンロード を提供しました。 ... Documents\WindowsPowerShell\Modulesディレクトリの下に解凍し、インポートを続行します。
モジュールアプローチとスナップインアプローチは同一ではないことに注意してください。スナップインをロードすると、Get-PSSnapin
(without-Registeredパラメーターを実行し、ロードしたもののみを表示する)SQLスナップインが表示されます。一方、sqlpsモジュールGet-PSSnapin
をロードすると、ロードされたスナップインが表示されないため、スナップインを調べるだけでInvoke-Sqlcmd
コマンドレットをテストするさまざまなブログエントリが偽陰性の結果をもたらす可能性があります。
2012.10.06更新
SqlpsモジュールとsqlpsミニシェルとSQL Serverスナップインの完全なストーリーについては、2部構成のミニシリーズをご覧ください SQL Server開発者とDBA向けの実用的なPowerShell 最近ある読者のコメントによると、Simple-Talk.comで公開され、問題の「混乱を解く」ことができました。 :-)
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
以下は、SQLスナップインを読み込むためにPowerShellプロファイルにある関数です。
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 Server 2008および2008 R2
Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100
2012および2014
Push-Location
Import-Module -Name SQLPS -DisableNameChecking
Pop-Location