SQL XML:将字段元素分组为一行

时间:2017-08-31 15:00:07

标签: sql xml xquery

要提取的数据的实际xml格式为:

<report>
  <data>
    <row>
      <field id="-2">Sterling, Bruce</field>
      <field id="18">Austin, TX</field>
      <field id="636">123456</field>
    </row>

===========

declare @DocHandle int
declare @XMLDoc nvarchar (MAX)
declare @xml XML

SELECT @xml = XMLData FROM CompanyXML

SELECT
   Tab.Col.value('.[@id="-2"]', 'varchar(50)') AS FullName,
   Tab.Col.value('.[@id="18"]', 'varchar(50)') AS Location,
   Tab.Col.value('.[@id="636"]', 'varchar(50)') AS EmployeeNbr

FROM @xml.nodes('report/data/row/field') Tab(Col)

结果是Bruce Sterling的FullName和其他列中的NULLS的一行,然后是TX的Brownsville的另一行,然后是EmployeeNbr的另一行123456.

但是,对于具有相关信息的人,我只需要一行代替键对行。

即,一行:FullName,Location和EmployeeNbr。

我尝试过CROSS APPLY和TOP但没有成功。为该人和相关信息获取一行的正确XQUERY是什么?

感谢。

1 个答案:

答案 0 :(得分:0)

嗯,这个OPENXML有效。这是在XPATH中为OPENXML提升一个级别并在WITH部分中降低一个级别的问题。感谢一位帮助过我的朋友。

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SELECT @XML = XMLData FROM CompanyXML

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT * FROM OPENXML(@hDoc, 'report/data/row',2)
WITH
(
   FullName [varchar](50) './field[@id="-2"]',
   Location [varchar](50) './field[@id="18"]',
   EmployeeNbr [varchar](50) './field[@id="636"]'
)


EXEC sp_xml_removedocument @hDoc
GO