如何读取SqlServer中的xml列

问题描述 投票:0回答:1

我在 SqlServer 表中有一个 XML 列,我应该从 XML 中查询几个值。

我的 XML 列类似于下面的 @str 变量:

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>'

我尝试使用下面的查询来读取 seqNb 和 orgNm 值,但没有结果。

DECLARE @xml xml
SELECT @xml = CAST(CAST(@str AS VARBINARY(MAX)) AS XML) 
Select
     m.c.value('@seqNb', 'int') as SequenceNumber1,
     m.c.query('./seqNb').value('.','int') as SequenceNumber2,
     m.c.value('@orgNm', 'varchar(max)') as OrganizationName1,
     m.c.query('./orgNm').value('.','int') as OrganizationName2
from @xml.nodes('/EmpHists/EmpHist') as m(c) 

我尝试从以下位置复制查询: 如何从 SQL Server 中的表中查询 Xml 值和属性?

但是由于 XML 数据与我查看过的其他数据(如 DtRng 标签)相比存在一些差异,我无法获得结果。我错过了什么?

sql-server xml sqlxml
1个回答
1
投票

您的 XML 不正确:属性未正确编码,而是嵌入到节点的文本中。

你可以像这样把它弄回原来的形状

Select
     x2.EmpHist.value('@seqNb', 'int') as SequenceNumber1,
     x2.EmpHist.value('@orgNm', 'varchar(max)') as OrganizationName1
FROM YourTable t
CROSS APPLY t.xmlData.nodes('/EmpHists/EmpHist') as x1(EmpHist)
CROSS APPLY (
    SELECT
      CAST(CONCAT('<EmpHist ', x1.EmpHist.value('text()[1]', 'nvarchar(max)'), '</EmpHist>') AS xml)
) v(Mangled)
CROSS APPLY v.Mangled.nodes('EmpHist') as x2(EmpHist);

db<>小提琴

基本上,它的作用是拉出内部文本值,并在其上连接开始和结束标记,然后将其转换回 XML。

© www.soinside.com 2019 - 2024. All rights reserved.