我有一个以XML格式存储数据的表.我需要从两个 node 获取数据.

示例脚本:

select MARKUP_MESSAGE  
from TABLE_NAME 
where row_uno = 6599064

示例结果:

<PrebillMarkup xmlns="clr-namespace:Aderant.Query.ViewModels;assembly=Aderant.Query" 
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">    
    <PrebillMarkup.NewValues>      
        <x:String x:Key="Narrative" xml:space="preserve">Review of policies against previous policies</x:String>    
    </PrebillMarkup.NewValues>    
    <PrebillMarkup.OriginalValues>      
        <x:String x:Key="Narrative" xml:space="preserve">Review of policies against previous policies sdffddgsgfdfdg</x:String>    
    </PrebillMarkup.OriginalValues>  
</PrebillMarkup>

我有两个 node <PrebillMarkup.NewValues><PrebillMarkup.OriginalValues>.

我希望能够从<PrebillMarkup.NewValues>中拿出x:String来阅读"额外政策的审查-测试"

因此,当我运行该语句时:

select MARKUP_MESSAGE  
from TABLE_NAME 
where row_uno = 6599064

结果将是"额外政策的审查-测试"

或者,如果我执行另一个查询来提取文本值

<x:String x:Key="Narrative" xml:space="preserve">

任何关于如何做到这一点的 idea ,因为我每次try 都会获得更多的XML数据,但我只需要纯文本.

谢谢所有人

SQL版本:

Microsoft SQL Server 2019 - 15.0.4280.7 (X64)   
Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64>

推荐答案

不提供minimal reproducible example.所以,我是随口说出来的.

正如@thoma已经指出的,您需要声明和使用名称空间.

XQuery .nodes().value()方法完成将XML分解成矩形/关系格式的工作.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (row_uno INT IDENTITY PRIMARY KEY, Markup_Message XML);
INSERT @tbl (Markup_Message) VALUES
(N'<PrebillMarkup xmlns="clr-namespace:Aderant.Query.ViewModels;assembly=Aderant.Query"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <PrebillMarkup.NewValues>
        <x:String x:Key="Narrative" xml:space="preserve">Review of policies against previous policies</x:String>
    </PrebillMarkup.NewValues>
    <PrebillMarkup.OriginalValues>
        <x:String x:Key="Narrative" xml:space="preserve">Review of policies against previous policies sdffddgsgfdfdg</x:String>
    </PrebillMarkup.OriginalValues>
</PrebillMarkup>');
-- DDL and sample data population, end

WITH XMLNAMESPACES(DEFAULT 'clr-namespace:Aderant.Query.ViewModels;assembly=Aderant.Query',
                   'http://schemas.microsoft.com/winfx/2006/xaml' AS x)
SELECT t.row_uno
    , c.value('local-name(.)', 'VARCHAR(128)') AS element_name
    , c.value('(x:String/@x:Key)[1]', 'VARCHAR(128)') AS attribute_key
    , c.value('(x:String/text())[1]', 'VARCHAR(128)') AS string_value
FROM @tbl AS t
CROSS APPLY Markup_Message.nodes('/PrebillMarkup/*') AS t1(c)
WHERE row_uno = 1;

Output

row_uno element_name attribute_key string_value
1 PrebillMarkup.NewValues Narrative Review of policies against previous policies
1 PrebillMarkup.OriginalValues Narrative Review of policies against previous policies sdffddgsgfdfdg

Sql相关问答推荐

按postquist中的日期查询json列

SQL查询每个客户的最新条目

使用Lead获取下一个不同的日期

计算周时出现SQL错误结果

Access中执行INSERT INTO查询时出现错误消息

如何为该查询编写正确分区依据

Select 列组(按同一表格中的另一列分组)Laravel 10

SQL Athena/prest判断值是否在嵌套的json数组中

为什么左联接结果在MS Access数据库中不匹配

获取分布在同一行的列中的出现次数

使用 union 的有序结果获取行数

如何修复初学者 SQL INNER JOIN 查询错误

SQL SUM Filter逻辑解释

雅典娜弄错了操作顺序

如何按日期和位置对最近 3 个报告日期的 SQL 查询结果进行透视?

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

具有日期时间条件的存储过程

如何根据另一列对行值进行分组?

有条件求和

BigQuery 将一行拆分为多列