2017-08-31 64 views
0

数据以提取的实际的XML格式是:SQL 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) 

的结果是一行布鲁斯·斯特林的全名与其他列NULL,则另一行的布朗斯维尔,然后另一行的EmployeeNbr 123456

但不是密钥对行的位置,我需要的只是一排人才h相关信息。

即,一行为:FullName,Location和EmployeeNbr。

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

谢谢。

回答

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