PowerShell Invoke-Sqlcmd,其中Array项作为WHERE中的变量

时间:2013-08-16 17:37:57

标签: arrays tsql variables powershell sqlcmd

我没有从这个脚本获得任何输出。甚至没有错误消息...我认为我的问题是在WHERE子句中使用变量。我已经尝试用背景逃避这个$(项目)但没有取得进展。谁能帮我理解我做错了什么?

$dbserver   = "AHDC389"
$dbase  = "FOO"
$table  = "$($dbase).dbo.BAR"

Import-Module “sqlps” -DisableNameChecking

$myArray    = @(Invoke-Sqlcmd "Select myColumn From adifferentserver.dbo.[mylookuptable]") | select-object -expand myColumn

ForEach ($item in $myyArray) {

    Invoke-Sqlcmd "Select * FROM $table Where FacilityID='$(item)' "

}

更新:

因此,当我修改下面的脚本时,似乎Where =的变量没有扩展。

$dbserver   = "AHDC389"
$dbase  = "FOO"
$table  = "$($dbase).dbo.BAR"

Import-Module “sqlps” -DisableNameChecking

$myArray    = @(Invoke-Sqlcmd "Select myColumn From adifferentserver.dbo.[mylookuptable]") | select-object -expand myColumn

$myQuery    = "Select * FROM {0} Where FacilityID='{1}'" -f $table, $item

ForEach ($item in $mArray) {

    Write-Host $myQuery
    #Invoke-Sqlcmd $myQuery

}

$ myQuery的值返回到控制台,指示$ item未展开:

Select * FROM  FOO.dbo.BAR Where Facility=''

2 个答案:

答案 0 :(得分:1)

这只是个人偏好,但我使用-format运算符构建字符串:

$cmdStr = 'Select * FROM {0} WHERE FacilityID={1}' -f $table, $item
Write-Host 'Executing: ' + $cmdStr
Invoke-Sqlcmd $cmdStr

答案 1 :(得分:0)

$itemForEach循环之前未定义,因此不能在之前的赋值中使用它。将声明移动到循环中。

ForEach ($item in $mArray) {
$myQuery    = "Select * FROM {0} Where FacilityID='{1}'" -f $table, $item

Write-Host $myQuery
#Invoke-Sqlcmd $myQuery

}