【问题标题】:Extract data XML columns in SQL Server在 SQL Server 中提取数据 XML 列
【发布时间】:2018-10-04 21:14:44
【问题描述】:

我有一个包含 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>

【问题讨论】:

    标签: sql-server xml


    【解决方案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]
    

    【讨论】:

    • 嗯,元素顺序是文档的固有部分,所以你可以依赖它。但我们不知道,这个 XML 是否总是以这种方式构造的。如果某些值是 NULL 并且缺少该元素怎么办? @marc_s 的答案是提供一种通过名称选择元素或返回完整 EAV 列表的方法。
    【解决方案2】:

    如果你想获得 所有 个带有名称、类型和值的项目,你可以使用这样的东西:

    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
    

    【讨论】:

    • 我的支持和一个小小的提示:我建议使用text()[1] 而不是(.)。在像上面这样简单的情况下,这不会产生任何差异,但在更复杂的情况下(有嵌套节点),这可能会导致意想不到的结果。
    • @Shnugo:感谢您的提示 - 我会尽量记住这一点,以备将来使用
    • 我在an answer 上发布了一些关于text() 的详细信息。可能很有趣..
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2021-12-23
    • 2020-06-17
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多