【问题标题】:PowerShell Invoke-Sqlcmd with Array item as variable in WHEREPowerShell Invoke-Sqlcmd 将数组项作为 WHERE 中的变量
【发布时间】:2013-08-16 17:37:57
【问题描述】:

我没有从这个脚本中得到任何输出。甚至没有错误消息...我认为我的问题是在 WHERE 子句中使用了变量。我试过用 backtics 来逃避这个 $(item) 但没有任何进展。谁能帮我理解我做错了什么?

$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=''

【问题讨论】:

  • 如果您在循环外构建字符串,则 $item 为空

标签: arrays tsql variables powershell sqlcmd


【解决方案1】:

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

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

【讨论】:

  • 执行此操作时,控制台仍然没有输出。我怀疑他的问题是 TSQL 需要在 WHERE='foo' 子句中使用 '。
  • 你在循环之外构建了字符串。
  • @ColinA.White 不要,因为你不是。我们都面面相觑
【解决方案2】:

$item 直到 ForEach 循环才定义,因此它不能在之前的分配中使用。将声明移到循环中。

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

Write-Host $myQuery
#Invoke-Sqlcmd $myQuery

}

【讨论】:

  • 刚刚看到@EBGreen 在我打字时回答了。
猜你喜欢
  • 2019-06-05
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2018-11-23
  • 2013-05-15
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多