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))`
我不知道错误在哪里完成。请帮帮我。
答案 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)
轻松为您提供这个不错的输出: