我正在开发一个项目,该项目从服务器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
答案 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