【问题标题】:SQL Server 2000 - extract data from XML stored in VARCHARSQL Server 2000 - 从存储在 VARCHAR 中的 XML 中提取数据
【发布时间】:2012-09-05 08:54:48
【问题描述】:

类似于Getting xml data stored in a varchar out of SQL 我需要从存储在VARCHAR 列中的XML 字符串中提取一个值。

但是,数据在 SQL Server 2000 上,因此不能使用 XML 类型。

这在 SQL Server 2000 中是否可行?

例如对于以下 XML,如何选择 <status> 节点中的值:

<entities>
    <entity>
        <name>foo</name>
        <status>1</status>
    </entity>
    <entity>
        <name>bar</name>
        <status>2</status>
    </entity>
</entities>

【问题讨论】:

    标签: sql-server xml tsql sql-server-2000


    【解决方案1】:

    我认为 openxml 是解决您问题的最佳方案。

    DECLARE @xml VARCHAR(2000)
    SET @xml = N'
    <entities>
        <entity>
            <name statue="1">foo</name>
            <status>1</status>
        </entity>
        <entity>
            <name statue="2">bar</name>
            <status>2</status>
        </entity>
    </entities>
    '
    
    DECLARE @docHandle int
    EXEC sp_xml_preparedocument @docHandle OUTPUT, @xml
    
    
    SELECT *
       FROM OPENXML(@docHandle, N'/entities/entity',2)
    WITH (name VARCHAR(20), status INT)
    

    【讨论】:

    • 我必须在 WITH () 子句中声明每个节点吗?我的真实数据比这个样本中的要多得多。
    • 据我所知,您应该提及节点名称。这与在表中定义字段相同。
    • 抱歉,我应该更具体一点 - XML 中有 9 个节点,但我只想提取其中的 2 个 - 我需要声明所有 9 个还是只声明我想要的 2 个?跨度>
    【解决方案2】:

    试试这个:

    declare @xml varchar(1000)
    SET @xml='<entities>
        <entity>
            <name>foo</name>
            <status>1</status>
        </entity>
        <entity>
            <name>bar</name>
            <status>2</status>
        </entity>
    </entities>'
    select @xml,SUBSTRING(@xml,CHARINDEX('<status>',@xml)+LEN('<status>'),(CHARINDEX('</status>',@xml)-(CHARINDEX('<status>',@xml)+LEN('<status>'))))
    

    【讨论】:

    • 这正是我自己研究的解决方案!
    • 我认为长度参数应该是-LEN('&lt;status&gt;') 而不是+LEN('&lt;status&gt;')
    • 它为您提供了我在机器上测试过的正确状态标签值
    【解决方案3】:

    你可以使用OPENXML;使文档中的示例适应您的特定情况应该不会太难。

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多