使用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
相关产品推荐
相关产品推荐

