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

使用PowerShell从SQL查询结果提取含指定XML节点值的对应ID

解决方案

你原有代码的问题是单独提取XML列后丢失了和原表ID的对应关系,遍历表行时同时校验当前行的XML节点、匹配成功直接取当前行ID即可实现需求,修正后完整代码如下:

$SqlConn= New-Object System.Data.SqlClient.SqlConnection
$SqlConn.ConnectionString= "Server= $server; Database=$DB"
$SqlConn.open()
$SqlCmd= New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText =$query
$SqlCmd.Connection=$SqlConn
$SqlAdapter= New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand=$SqlCmd
$Dataset= New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet) | Out-Null
$table= $DataSet.Tables[0]
$SqlConn.Close()

# 存储符合条件的ID
$matchedIds = @()

# 逐行遍历表数据
foreach ($row in $table) {
    # 转换当前行的NTLdata为XML格式
    [xml]$ntlXml = $row.NTLdata
    # 直接用XPath过滤值为22的Edition节点
    $targetNode = $ntlXml.SelectSingleNode("//Edition[text()='22']")
    if ($null -ne $targetNode) {
        $matchedIds += $row.ID
    }
}

# 输出所有匹配的ID
$matchedIds | ForEach-Object { Write-Host "符合条件的ID:$_" }

优化方案(大数据量场景适用)

如果表数据量较大,直接在SQL层面完成XML过滤效率更高,以SQL Server为例,你可以直接修改查询语句$query,直接返回符合条件的ID,不需要在PowerShell中二次处理:

SELECT ID FROM 你的表名
WHERE NTLdata.exist('//Edition[text()=22]') = 1

内容的提问来源于stack exchange,提问作者HAH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:06:01