Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 解析存储在SQL行中的XML-MS SQL服务器_Sql Server_Xml_Tsql_Xquery - Fatal编程技术网

Sql server 解析存储在SQL行中的XML-MS SQL服务器

Sql server 解析存储在SQL行中的XML-MS SQL服务器,sql-server,xml,tsql,xquery,Sql Server,Xml,Tsql,Xquery,我有一个包含10个用户的表user\u table,其中一个列的名称为XML\u PATH。 XML_路径包含如下所示的XML文件: <Column> <Column Name="user_time_zone" DataType="String">GMT</Column> <Column Name="user_time_type" DataType="

我有一个包含10个用户的表user\u table,其中一个列的名称为XML\u PATH。 XML_路径包含如下所示的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查询并获取用户\u TIME\u TYPE节点的值作为结果。

您可以使用。例如:

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()')
或者如果列类型不是XML

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

虽然这个问题已经得到了回答,但这里有一个更干净的解决方案

.nodes和.value XQuery方法的组合使用指定的数据类型提供精确的答案

SQL


请不要滥发标签,它们是为了吸引正确的观众,如果你使用不相关的标签,你会得到不相关的访问者。这不符合要求,我有一个专栏,它从用户数据中选择XML数据,这个XML数据有10个条目,因为用户数据表中有10个用户。这10个条目中的每个条目都有XML格式。我厌倦了使用DECLARE@Value XML=select XML\u DATA from user\u table,然后选择@Value.query'/Column/Column[@Name=user\u time\u type]/text',意思是返回了多个值,这是真的,因为我有多个条目10
SELECT cast(XML_DATA as XML).query('/Column/Column[@Name=''user_time_type'']/text()')
FROM user_date
-- 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          |
+----------------+