Invoke-Sqlcmd返回结果作为变量在二次查询中无数据的问题
问题分析与解决
你的代码存在两个关键问题:
变量赋值顺序错误
你在定义$query2的时候,$ORDUNIQ还没有被Invoke-Sqlcmd赋值,此时$ORDUNIQ是空值,导致生成的SQL查询条件无效。字符串插值语法错误
在PowerShell的双引号字符串中,直接写$ORDUNIQ.ORDUNIQ会被解析为“变量$ORDUNIQ的值拼接字符串.ORDUNIQ”,而不是访问$ORDUNIQ对象的ORDUNIQ属性。需要用子表达式$()包裹属性访问,才能正确解析。
修正后的代码如下:
$RAWFiles = Get-ChildItem D:\Imports\Test\*.csv $content = Import-Csv $RAWFiles | Where-Object 'Order Type' -eq 'B2B' ForEach ($row in $content) { $ORDNUMBER = $row.'OrderRef' $SQLServer = "XXXXX-XXX" $db1 = "XXXXXX" # 先执行第一个查询获取ORDUNIQ $query1 = "SELECT ORDUNIQ FROM OEORDH WHERE ORDNUMBER = '$ORDNUMBER'" $ORDUNIQ = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $db1 -Query $query1 # 再定义第二个查询,用子表达式正确访问属性 $query2 = "SELECT OEORDD.ITEM FROM OEORDD WHERE ORDUNIQ = '$($ORDUNIQ.ORDUNIQ)'" $ORDDATA = Invoke-SQLcmd -ServerInstance $SQLServer -Database $db1 -Query $query2 }
另外,为了避免SQL注入风险,更推荐使用参数化查询,示例如下:
$RAWFiles = Get-ChildItem D:\Imports\Test\*.csv $content = Import-Csv $RAWFiles | Where-Object 'Order Type' -eq 'B2B' ForEach ($row in $content) { $ORDNUMBER = $row.'OrderRef' $SQLServer = "XXXXX-XXX" $db1 = "XXXXXX" # 参数化查询第一个语句 $query1 = "SELECT ORDUNIQ FROM OEORDH WHERE ORDNUMBER = @ORDNUMBER" $ORDUNIQ = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $db1 -Query $query1 -Parameter @{ORDNUMBER = $ORDNUMBER} # 参数化查询第二个语句 $query2 = "SELECT OEORDD.ITEM FROM OEORDD WHERE ORDUNIQ = @ORDUNIQ" $ORDDATA = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $db1 -Query $query2 -Parameter @{ORDUNIQ = $ORDUNIQ.ORDUNIQ} }
内容的提问来源于stack exchange,提问作者ColinA
相关产品推荐
相关产品推荐

