2016-05-21 4 views
-1

SQL Serverインスタンスに接続してクエリするコードスニペットがあります。

$instance="Instance" 
$DB = "master" 
$sqlConnection = ConnectionString $Instance $DB 
$sqlConnection = New-Object System.Data.SqlClient.SQLConnection($sqlConnection) 
$sqlConnection.Open() 

ただし、同じコードスニペットをforeachループに置くと、一連のサーバーを反復処理する必要がありますが、動作しません。

foreach ($instance in $Instances) { 
    $instance 
    $DB = "master" 
    $sqlConnection = ConnectionString $Instance $DB 
    $sqlConnection = New-Object System.Data.SqlClient.SQLConnection($sqlConnection) 
    $sqlConnection.Open() 
} 

エラー:

Exception calling "Open" with "0" argument(s): "A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)"

+0

異なるものに同じveriableを使用しないでください(ここでは、接続文字列と接続オブジェクトの両方に '$ sqlConnection'があります)。接続を開く前に接続文字列を確認してください。また、関数(?) 'ConnectionString'は実際に何をしていますか? –

+0

同じ変数名を使用して新しいものを開く前に、少なくとも接続を閉じます。 – Trondh

+0

このような接続を再利用するには、 'Begin'' Process'''''''を使用してください。ボーナスとして、 'End'ブロック内の接続を閉じたいとします。 – user4317867

答えて

0

Ansgarのが正しいです。変数名は再利用しないでください。

これを実装する簡単な方法は、ほとんどのコードを1行にまとめたthe Invoke-Query moduleを使用することです。

$sql = "Update myTable set myColumn = 1;" 
$db= "master" 
$instances = ("instance1","instance2") 
foreach ($instance in $instances) 
    ## This command uses windows auth. 
    ## You can pass in a Credential object to use SqlServer auth. 
    $rowcount = $sql | Invoke-SqlServerQuery -Server $instance -Database $db -CUD 
    Write-Host "Updated $rowcount rows on server $instance." 
} 

免責事項:私はモジュールの作成者です。

+0

私はforeachからこれらのコマンドを実行している間、いくつかの異なる問題があると感じます。すべて私が直接実行する場合は実行されますが、foreachの下で呼び出されたときは実行されません。私を案内してください。 – Adarsh

+0

Invoke呼び出しは、foreachループ内でうまく動作するはずです。あなたが見ているエラー/ビヘイビアは何ですか?問題の原因となっているサンプルコードをさらに投稿できますか? (side note:rowcount変数名でタイプミスを修正しました。それは問題でしたか?) –

関連する問題