如何在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>节点的序号和公司名称:
| SequenceNumber | OrganizationName |
|---|---|
| 1 | ABC Corporation |
| 2 | DEF Corporation |
| 3 | GHI Corporation |
补充说明
XML中的<DtRng>子节点不会影响本次查询,因为nodes('/EmpHists/EmpHist')已经准确定位到目标节点,无需处理嵌套子节点。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

