将变量SQL实例名称传递给Invoke-SQLcmd时出错

时间:2016-04-01 18:38:25

标签: sql-server powershell sqlps

我正在开发一个项目,该项目从服务器A中提取SQL实例列表,然后遍历返回的列表并运行查询(最终审核用户并将结果插入表中)但是获取错误instance not found。我似乎没有在循环中正确定义变量,因为如果我对实例名称进行硬编码就可以了。

我很感激有关如何解决此问题的任何意见。

$Serverlist = invoke-sqlcmd -ServerInstance TESTSERVER1 -Database TESTDB -Query "SELECT instancename from testtable"

foreach ($SQLInst in $Serverlist) 
{
$Inst = $SQLInst.INSTANCE
Invoke-Sqlcmd -ServerInstance ${$Inst} -Database Master -Query "select @@servername as servername" | select -ExpandProperty servername
} #end foreach loop
  

Invoke-Sqlcmd:发生了与网络相关或特定于实例的错误   同时建立与SQL Server的连接。服务器不是   发现或无法访问。验证实例名称是否正确   并且SQL Server配置为允许远程连接。   (提供者:命名管道提供者,错误:40 - 无法打开   连接到SQL Server)在行:12 char:1   + Invoke-Sqlcmd -ServerInstance $ {$ SQLInst} -Database Master -Query" select @@ serv ...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:InvalidOperation:(:) [Invoke-Sqlcmd],SqlException       + FullyQualifiedErrorId:SqlExectionError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

2 个答案:

答案 0 :(得分:0)

在这个例子中,没有理由像${$Inst}那样使用大括号。

只需使用$Inst即可。如果您确实使用花括号,则不要使用$内的${Inst}

Invoke-Sqlcmd -ServerInstance $Inst

# or

Invoke-Sqlcmd -ServerInstance ${Inst}

答案 1 :(得分:0)

我会检查以确保每个实例都是正确的:

$Serverlist = invoke-sqlcmd -ServerInstance TESTSERVER1 -Database TESTDB -Query "SELECT instancename from testtable"

    foreach ($SQLInst in $Serverlist) 
    {
      $Inst = $SQLInst.INSTANCE
      Write-Host $Inst
    } #end foreach loop

我注意到我之前的陈述存在一些问题。你能试试吗?

$Serverlist = invoke-sqlcmd -ServerInstance TESTSERVER1 -Database TESTDB -Query "SELECT instancename from testtable"

foreach ($SQLInst in $Serverlist) 
{  
  $Inst = $SQLInst.instancename
Invoke-Sqlcmd -ServerInstance "$Inst" -Database Master -Query "select @@servername as servername" | select -ExpandProperty servername
} #end foreach loop