【问题标题】:SQL Query Column with XML Data带有 XML 数据的 SQL 查询列
【发布时间】:2015-04-08 17:05:43
【问题描述】:

我在一列中有如下数据,如何查询里面的值。

<deliveryPart notificationId="12345">
    <message address="email@email.com" content="multipart/alternative" domain="email.com" format="0" id="159436637" recipient-id="098765" targetCode="__MAIN__">
        <custom>
            <recipient Nickname="mynickname" id="54321" />
            <targetData Incident_Id="1509403" reference_nb="0000-0000" />
        </custom>
    </message>
</deliveryPart>

我试了一下,但我以前从未做过,而且时间紧迫。

select top 10 *
from [db].[db].[table]
where mData.value('(deliveryPart/message/recipient-id)[1]','varchar(max)') like '098765'

我收到以下错误

消息 4121,第 16 级,状态 1,第 1 行
找不到列“mData”或用户定义的函数或聚合“mData.value”,或者名称不明确。

更新

我正在使用以下代码来获取 xml 值并且它可以工作

SELECT TOP 1000 B1.[mData].value('(deliveryPart/message/@id)[1]', 'NVARCHAR(MAX)') AS 'MessageID', B1.[mData].value('(deliveryPart/message/@address)[1]', 'NVARCHAR(MAX)') AS 'Address'
  FROM (SELECT CAST(mData as XML) as xmlData FROM [dbo].[db].[table]) B0
  CROSS APPLY xmlData.nodes('/') B1 (mData)
  WHERE B1.[mData].value('(deliveryPart/message/@address)[1]', 'NVARCHAR(MAX)') LIKE '%@%'

它返回存储在 ntext 字段中的 xml 值就好了。

180646774   email1@email.com
159436627   test2@hotmail.com
159436637   test3@hotmail.com

但是,我需要从 mData 列之外获取值并且不允许我这样做。

【问题讨论】:

    标签: sql xml sql-server-2008


    【解决方案1】:

    您需要使用 @recipient-id 作为 XML 属性 - 而不是 XML 元素:

    <message address="email@email.com" content="multipart/alternative" 
             domain="email.com" format="0" id="159436637" 
             recipient-id="098765" targetCode="__MAIN__">
             ************  this is an *attribute* - use the `@` to select it!
    

    代码:

    select top 10 *
    from [db].[db].[table]
    where mData.value('(deliveryPart/message/@recipient-id)[1]', 'varchar(max)') like '098765'
    

    【讨论】:

    • 还是同样的错误,mData列的数据类型是ntext。
    • @J.D:首先,ntext 已被弃用——停止使用它。其次:如果这是 XML - 为什么不使用 XML 数据类型?这是最适合的数据类型 - 也是支持这些 XQuery 表达式的唯一 数据类型 ....
    • 嗨,Marc,这是默认使用 crm 工具提供的,我设法通过将列转换为 xml 来获得某种结果,SELECT cast(mData as XML).query('deliveryPart/message[@recipient-id="12345"]') as xmlData, * FROM [dbo].[data].[table]
    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多