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

SQL子查询提取XML合同号筛选数据时返回多值错误如何解决

问题原因

当前报错是因为WHERE子句后的子查询返回了多行结果,而=运算符不支持右侧匹配多值,因此触发了512错误。同时你用字符串截取的方式提取XML中的合同号稳定性较差,XML结构稍有变动就会导致取值错误。

解决方案

该需求完全可以实现,以下提供两种可行方案:

方案1:直接调整原有写法(兼容你现有的字符串提取逻辑)

把关联逻辑改成JOIN形式,直接对每行table1的字段做合同号提取匹配,避免子查询返回多值的问题:

SELECT DISTINCT t1.id_column, t1.d_description
FROM table1 t1
INNER JOIN table3 b 
  ON t1.id_column = b.id_column
WHERE CONVERT(VARCHAR(6), b.d_date, 112) > '202108'
  AND SUBSTRING(CAST(t1.g_xml_comprobante AS NVARCHAR(MAX)), CHARINDEX('contrato=', CAST(t1.g_xml_comprobante AS NVARCHAR(MAX))) + 10, 15) = '2019896177'

说明:加DISTINCT是为了避免table3中同一个id_column存在多条符合日期条件的记录,导致最终结果重复。

方案2:使用原生XML方法提取合同号(更稳定)

SQL Server支持直接对XML类型做XPath查询,不需要手动截取字符串,适配性更强,你只需要根据实际的XML结构调整XPath规则即可:

SELECT DISTINCT t1.id_column, t1.d_description
FROM table1 t1
INNER JOIN table3 b 
  ON t1.id_column = b.id_column
WHERE CONVERT(VARCHAR(6), b.d_date, 112) > '202108'
  -- 如果g_xml_comprobante本身是XML类型,可去掉外层CAST转换
  AND CAST(t1.g_xml_comprobante AS XML).value('(/*/@contrato)[1]', 'VARCHAR(15)') = '2019896177'

说明:示例中的(/*/@contrato)[1]是取XML根节点的contrato属性值,你可以根据实际的XML层级调整对应的XPath表达式即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:36:03