在SQL Server中提取数据XML列

时间:2018-10-04 21:14:44

标签: sql-server xml

我有一个具有70K记录的表,其中有一个列XMLMetadata-该列包含所有70k的xml数据。

我需要一种从xml列中为所有70K记录增加一项的方法。我需要从全部70k中提取的商品名称为<Item Name="DocTitle" Type="String">

有没有办法我可以轻松拉动它?

<Metadata>
    <Item Name="ID" Type="String">1364416</Item>
    <Item Name="Name" Type="String">website</Item>
    <Item Name="Type" Type="String">WebContent</Item>
    <Item Name="Title" Type="String">Close Out Letter 11/1/17</Item>
    <Item Name="Author" Type="String">Seba</Item>
    ....
</Metadata>

2 个答案:

答案 0 :(得分:1)

尝试此查询

SELECT  
      XMLMetadata.value('(/Metadata/node())[1]', 'nvarchar(max)') as ID, 
      XMLMetadata.value('(/Metadata/node())[2]', 'nvarchar(max)') as Name, 
      XMLMetadata.value('(/Metadata/node())[3]', 'nvarchar(max)') as Type, 
      XMLMetadata.value('(/Metadata/node())[4]', 'nvarchar(max)') as Title, 
      XMLMetadata.value('(/Metadata/node())[5]', 'nvarchar(max)') as Author 
FROM [myTable]

答案 1 :(得分:1)

如果要获取具有名称,类型和值的所有项,则可以使用以下内容:

SELECT
    ItemName = XC.value('(@Name)', 'varchar(20)'),
    ItemType = XC.value('(@Type)', 'varchar(20)'),
    ItemValue = XC.value('(.)', 'varchar(50)')
FROM
    dbo.YourTableNameHere
CROSS APPLY 
    XmlMetadata.nodes('/Metadata/Item') AS XT(XC)

,如果您只想基于Name属性获得一个值,则可以在此处使用以下代码:

SELECT
    ItemValue = XmlMetadata.value('(/Metadata/Item[@Name="Title"]/text())[1]', 'varchar(50)')
FROM
    dbo.YourTableNameHere