【问题标题】:Parse XML stored in SQL row - MS SQL Sever解析存储在 SQL 行中的 XML - MYSQL Server
【发布时间】:2020-08-18 12:06:21
【问题描述】:

我有一个包含 10 个用户的表 (user_table),其中一列的名称为“XML_PATH”。 XML_PATH 包含如下所示的 XML 文件:

<Column>
         <Column Name="user_time_zone" DataType="String">GMT</Column>
         <Column Name="user_time_type" DataType="String">24hrs</Column>
         ...
         <Column Name="user_time_country" DataType="String">India</Column>
</Column>

我需要知道是否可以编写 SQL 查询并获取 USER_TIME_TYPE 节点的值作为结果。

【问题讨论】:

  • 请不要发送垃圾标签,它们是为了吸引正确的受众,如果您使用不相关的标签,您会得到不相关的访问者

标签: sql-server xml tsql xquery


【解决方案1】:

您可以使用XPATH 执行此操作。示例:

DECLARE @Value XML = '
<Column>
         <Column Name="user_time_zone" DataType="String">GMT</Column>
         <Column Name="user_time_type" DataType="String">24hrs</Column>
         <Column Name="user_time_country" DataType="String">India</Column>
</Column>
'

SELECT @Value.query('/Column/Column[@Name=''user_time_type'']/text()')

输出:

24 小时

如果列类型是 XML,您可以使用 query 方法对列执行 XPATH 查询。 要测试您的 XPATH 表达式,您可以使用 XPath tester

SQLFiddle

如果您有专栏,您可以简单地执行以下操作:

SELECT XML_DATA.query('/Column/Column[@Name=''user_time_type'']/text()')
FROM user_date

或者如果列类型不是 XML

SELECT cast(XML_DATA as XML).query('/Column/Column[@Name=''user_time_type'']/text()')
FROM user_date

【讨论】:

  • 这不符合要求,我有一个列(从user_date中选择XML_DATA),这个XML_DATA有10个条目(因为user_data表中有10个用户)。这 10 个条目中的每个条目都具有 XML 格式。我厌倦了使用 DECLARE @Value XML = (select XML_DATA from user_table) 然后 SELECT @Value.query('/Column/Column[@Name=''user_time_type'']/text()'),也就是说返回超过 1值,这是真的,因为我有超过 1 个条目(准确地说是 10 个)
【解决方案2】:

虽然这个问题已经得到解答,但这里有一个更简洁的解决方案。

.nodes().value() XQuery 方法的组合使用指定的数据类型提供准确的答案。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<Column>
         <Column Name="user_time_zone" DataType="String">GMT</Column>
         <Column Name="user_time_type" DataType="String">24hrs</Column>
         <Column Name="user_time_country" DataType="String">India</Column>
</Column>');
-- DDL and sample data population, end

SELECT c.value('(./text())[1]','VARCHAR(20)') AS user_time_type
FROM @tbl
    CROSS APPLY xmldata.nodes('/Column/Column[@Name="user_time_type"]') AS t(c);

输出

+----------------+
| user_time_type |
+----------------+
| 24hrs          |
+----------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多