OpenXml为XML中的元素返回null

时间:2014-11-07 05:13:03

标签: sql sql-server sql-server-2008 openxml

Declare @xml xml,
@y int
set @xml= '<ContactUpdates>
       <Contact VendorID="4"><LastName>McCrystle</LastName>
       <FirstName>Timothy</FirstName>
       </Contact>
       <Contact VendorID="10">
        <LastName>Flynn</LastName>
        <FirstName>Erin</FirstName>
        </Contact></ContactUpdates>'


Exec sp_xml_preparedocument @y output, @xml;
Select * from openxml(@y,'/ContactUpdates/Contact')
  With (VendorID Varchar(20),
        LastName Varchar(30),
        FirstName Varchar(30))`

The result is

我不知道错误在哪里完成。请帮帮我。

3 个答案:

答案 0 :(得分:4)

您可以混合使用以属性为中心和以元素为中心的投影。映射VendorId而不是两个元素的原因是因为以属性为中心是默认值。在混合/复杂层次结构方案中,作为per here,您需要明确提供xpath映射:

Exec sp_xml_preparedocument @y output, @xml;
Select * from openxml(@y,'/ContactUpdates/Contact')
  With (VendorID Varchar(20) '@VendorID', -- Attribute
        LastName Varchar(30) 'LastName', -- Element
        FirstName Varchar(30) 'FirstName'); -- Element

修改

需要注意的是,flags属性是一个按位样式[flag]。这意味着您可以将选项组合在一起。 1以属性为中心,2以元素为中心,因此1 | 2 = 3会同时为您提供:

Exec sp_xml_preparedocument @y output, @xml;
Select * from openxml(@y,'/ContactUpdates/Contact', 3)
  With (VendorID Varchar(20),
        LastName Varchar(30),
        FirstName Varchar(30));

-- Remember to release the handle with sp_xml_removedocument 

但是我不相信这是一个好习惯 - 它对开发人员来说并没有太大的影响,并且它可能具有负面的性能影响,因为它没有特定的xpath那么具体。

答案 1 :(得分:1)

这应该可以帮到你

SELECT VendorID = Container.value('(@VendorID)[1]', 'varchar(50)'),
       LastName = Container.value('(LastName)[1]', 'varchar(50)'),
       FirstName = Container.value('(FirstName)[1]', 'varchar(50)')
FROM   (SELECT @xml Columndata) a
       CROSS APPLY Columndata.nodes('/ContactUpdates/Contact') AS T(Container) 

按照斯图尔特的评论编辑。

SELECT VendorID = Container.value('(@VendorID)[1]', 'varchar(50)'),
       LastName = Container.value('(LastName)[1]', 'varchar(50)'),
       FirstName = Container.value('(FirstName)[1]', 'varchar(50)')
FROM   @xml.nodes('/ContactUpdates/Contact') AS T(Container) 

答案 2 :(得分:1)

在SQL Server中使用正确的本机XQuery支持:

SELECT
    VendorID = xc.value('@VendorID', 'int'),
    FirstName = xc.value('(FirstName)[1]', 'varchar(50)'),
    LastName = xc.value('(LastName)[1]', 'varchar(50)')
FROM 
    @xml.nodes('/ContactUpdates/Contact') AS XT(XC)

轻松为您提供这个不错的输出:

enter image description here