解析存储在SQL行中的XML-MS SQL Sever

问题描述

我有一个包含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节点的值。

解决方法

您可以使用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
,

尽管已经回答了这个问题,但这是一个更干净的解决方案。

.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          |
+----------------+