【问题标题】:Extracting value from XML in SQL Server在 SQL Server 中从 XML 中提取值
【发布时间】:2016-03-14 19:46:16
【问题描述】:

我正在尝试编写 SQL Server 查询以从 XML 列中选择值。

messagebody 列(XML 类型)的内容如下:

<?xml version="1.0" encoding="utf-16"?>
<GetActivityUnemploymentGenerelEventType xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ActivityItem xmlns="http://service.bmuuuu/">
        <ActivityCoreItem xmlns="http://service.bmxxxx">
            <ActivityIdentifier xmlns="http://service.bmyyyy">d5ck7132-703c-1234-8099-963b35b24bc5</ActivityIdentifier>
            <StartDate xmlns="http://service.bmaaa">2016-01-25</StartDate>

我正在尝试确定startdateActivityIdentifier 的价值。

我已经尝试了几种解决方案:

SELECT XML.query('messagebody(/GetActivityUnemploymentGenerelEventType/ActivityItem/ActivityCoreItem/ActivityIdentifier)')
FROM table

SELECT messagebody.value('(/GetActivityUnemploymentGenerelEventType/ActivityCoreItem/ActivityIdentifier/Value)[1]', 'int')
FROM table

SELECT messagebody.value('(/GetActivityUnemploymentGenerelEventType//ActivityCoreItem/ActivityIdentifier())[1]', 'nvarchar(max)')
FROM table

查询结果:

找不到列“messagebody”或用户定义的函数或聚合“messagebody.value”,或者名称不明确。

有什么建议吗?

【问题讨论】:

    标签: sql sql-server xml tsql


    【解决方案1】:

    您没有尊重 XML 文档中现有的 XML 命名空间!你需要在你的 XQuery 中包含这些 - 试试这个:

    ;WITH XMLNAMESPACES ('http://service.bmuuuu/' AS ns1, 
                         'http://service.bmxxxx' AS ns2, 
                         'http://service.bmyyyy' as ns3, 
                         'http://service.bmaaa' as ns4)
    SELECT
        ActivityIdentifier = xc.value('(ns3:ActivityIdentifier)[1]', 'varchar(100)'),
        StartDate = xc.value('(ns4:StartDate)[1]', 'varchar(25)')
    FROM 
        dbo.YourTable
    CROSS APPLY
        MessageBody.nodes('/GetActivityUnemploymentGenerelEventType/ns1:ActivityItem/ns2:ActivityCoreItem') AS XT(XC)
    

    【讨论】:

    • 嗨 marc_s 感谢您抽出宝贵时间回答我。也许我做错了什么,但是当我应用您的解决方案时,我收到此错误:关键字“CROSS”附近的语法不正确。有任何想法吗?但再次感谢 - 现在我知道的更多了。
    • @Dunkel:你使用了你的 actual 表名吗?我只是使用了一个占位符,因为我不知道你的表名到底叫什么。 CROSS APPLYXML 数据类型一起在 SQL Server 2005 中引入 - 所以我假设您至少使用的是该版本(或更新的版本)
    • @Dunkel:如果这个答案帮助你解决了你的问题,那么请accept this answer。这将表达您对花费自己的时间帮助您的人们的感激之情。
    • 由 OP 用户驱动的驱动器再也没有出现过,但是嘿,我会投票来尽我的一份力:)
    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多