问题描述
我有一个包含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
如果您有专栏,则可以简单地执行以下操作:
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 |
+----------------+