You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Invoke-Sqlcmd返回结果作为变量在二次查询中无数据的问题

问题分析与解决

你的代码存在两个关键问题:

  1. 变量赋值顺序错误
    你在定义$query2的时候,$ORDUNIQ还没有被Invoke-Sqlcmd赋值,此时$ORDUNIQ是空值,导致生成的SQL查询条件无效。

  2. 字符串插值语法错误
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:05:22