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

如何在SQL Server中读取XML列并查询属性值?

SQL Server XML列查询问题解决

问题根源

你遇到的核心问题是混淆了XML属性与子节点的查询语法:

  • seqNb、orgNm是<EmpHist>节点的属性(以@开头的键值对),并非独立的子节点(如<DtRng>这类嵌套标签)。
  • 你的查询中,m.c.query('./seqNb')和m.c.query('./orgNm')是在查找名为seqNb/orgNm的子节点,但你的XML结构里根本不存在这类子节点,因此返回空结果。
  • 额外错误:OrganizationName2中把字符串类型的orgNm强转成int,会导致类型转换错误(即使找到节点也无法正常返回)。

正确查询示例

以下是修正后的查询,直接通过@属性名语法读取属性值,同时简化XML转换步骤:

DECLARE @str nvarchar(2000)
SET @str = '<EmpHists>
  <EmpHist seqNb="1" orgNm="ABC Corporation" employed="N" city="SACRAMENTO" state="CA" cntryCd="USA" pstnHeld="OTHER - OFFICE MANAGER">
    <DtRng fromDt="1981-03" />
  </EmpHist>
    <EmpHist seqNb="2" orgNm="DEF Corporation" employed="Y" city="NEWYORK" state="NY" cntryCd="USA" pstnHeld="OTHER - OFFICE STAFF">
    <DtRng fromDt="1981-03" />
  </EmpHist>
    <EmpHist seqNb="3" orgNm="GHI Corporation" employed="N" city="LOSANGELS" state="LA" cntryCd="USA" pstnHeld="OTHER - OFFICE ASSISTANT">
    <DtRng fromDt="1981-03" />
  </EmpHist>
</EmpHists>'

DECLARE @xml xml
SET @xml = CAST(@str AS XML) 

SELECT
     m.c.value('@seqNb', 'int') AS SequenceNumber,
     m.c.value('@orgNm', 'varchar(100)') AS OrganizationName
FROM @xml.nodes('/EmpHists/EmpHist') AS m(c) 

执行结果

该查询会返回3行数据,对应每个<EmpHist>节点的序号和公司名称:

SequenceNumberOrganizationName
1ABC Corporation
2DEF Corporation
3GHI Corporation

补充说明

XML中的<DtRng>子节点不会影响本次查询,因为nodes('/EmpHists/EmpHist')已经准确定位到目标节点,无需处理嵌套子节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 07:52:14