要提取的数据的实际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是什么?
感谢。
答案 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