2017-08-31 1 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) 

Bruce SterlingのFullNameに1行、他の列にNULLS、次にBrownsville、TXの別の行、123456のEmployeeNbrの行があります。

しかし、キーペアの行の代わりに、人ウィット関連情報

つまり、FullName、Location、およびEmployeeNbrの1行です。

私はCROSS APPLYとTOPを試しましたが、成功しませんでした。その人物と関連情報の1行を取得する正しいXQUERYは何ですか?

ありがとうございました。

答えて

0

まあ、このOPENXMLが機能します。これは、OPENXMLのXPATHレベルを上り、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