$ con.Open()在foreach中不起作用,但在直接使用时起作用

时间:2016-05-21 16:19:59

标签: sql-server powershell foreach

我有一个代码片段,用于连接到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()
}

错误:

  

异常通话"打开"用" 0"参数:"建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)"

1 个答案:

答案 0 :(得分:0)

安斯加是对的。你不应该重用变量名。

更简单的实现方法是使用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."
}

免责声明:我是该模块的作者。