誰かが示されている次のコードを手伝ってくれるかどうか疑問に思いました。基本的に、可能であればこのコードを再ハッシュして、「servers.txt」という名前のテキストファイルで提供される一連のサーバー名に対して実行できるようにしようとしています。
DBCCはPSスクリプトによって実行され、そのサーバー名のすべてのDBに対して実行される必要があります。このスクリプトでこれを行う方法を理解するには、PSの速度が十分ではありません。
サーバー名ごとにハードコーディングする代わりに、値をプラグインできるように変更するにはどうすればよいですか?
私はこれについて少し読んで、Invoke-Sql
PSのSQL2008拡張であると私が信じるコマンドを見ました。
残念ながら、PS環境はSQL 2005ボックスのものであり、これを移動する権限がないため、invokeを使用できないとは思わないでください。
元のコードを参照してから、invokeを使用して実行するための実験を行ってください。
$ScriptName = $myInvocation.MyCommand.Name
[void][reflection.assembly]::LoadWithPartialName("System.Data.SqlClient")
$ConnString = "Server=DB-OCC05;Integrated Security=SSPI;Database=master;Application Name=$ScriptName"
$MasterConn = new-object ('System.Data.SqlClient.SqlConnection') $ConnString
$MasterCmd = new-object System.Data.SqlClient.SqlCommand
$MasterCmd.Connection = $MasterConn
$SqlDBCC = "DBCC CHECKDB(master) WITH TABLERESULTS"
$MasterCmd.CommandText = $SqlDBCC
$MasterConn.Open()
$Rset = $MasterCmd.ExecuteReader()
If ($Rset.HasRows -eq $true) {
While ($Rset.Read()) {
$line = $Rset["MessageText"]
If ($Rset["Level"] -gt 10) {
Write-Host $line -backgroundcolor Yellow -foregroundcolor Red
} else {
Write-Host $line
}
}
$Rset.Close()
}
$MasterConn.Close()
そして、SQL2005環境から実行している私のテスト:
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
また、このテストを試しました:
gc "C:\Powershell\Servers.txt" | foreach-object {Invoke-Sqlcmd "DBCC checkdb;" -ServerInstance "$_\MyInstance"}
しかし、上記のテスト実行は、次の原因で機能しませんでした。
「Invoke-Sqlcmd」という用語は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスを確認してください。