我在 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 标签)相比存在一些差异,我无法获得结果。我错过了什么?
您的 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);
基本上,它的作用是拉出内部文本值,并在其上连接开始和结束标记,然后将其转换回 XML。