Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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 逗号分隔XML字段查询_Sql Server_Xml_Tsql_Xquery - Fatal编程技术网

Sql server 逗号分隔XML字段查询

Sql server 逗号分隔XML字段查询,sql-server,xml,tsql,xquery,Sql Server,Xml,Tsql,Xquery,我正在寻找一种解决方案,用逗号分隔符从XML字段中获取多个值 例如:我有一个表,它是一个pin和一个XML字段 1,<item>Number One</item><item>Number Two</item><item>Number Three</item> 使用以下代码,我可以得到以下结果: 1, Number One Number Two Number Three 使用以下查询: SELECT t.pin

我正在寻找一种解决方案,用逗号分隔符从XML字段中获取多个值

例如:我有一个表,它是一个pin和一个XML字段

1,<item>Number One</item><item>Number Two</item><item>Number Three</item>
使用以下代码,我可以得到以下结果:

1, Number One Number Two Number Three 
使用以下查询:

SELECT 
    t.pin,
    t.items.query('for $I in items return string($I)').value('.', 'nvarchar(max)')  AS 'items'
FROM
    table
由于项目描述之间存在空格,我无法对结果进行“替换”。

请查看

SQL

试试这个:

SELECT 
    t.pin,
    STUFF(@xml.query('for $I in /item return concat('','', $I)').value('.', 'nvarchar(max)'), 1, 1, '')   AS 'items'
FROM
    table

这个方法很完美,谢谢你花时间。它还考虑了字符串的格式,这是一个非常好的操作。@GavCheal漂亮的双关语。很高兴它起作用了。别忘了在回答的问题上做标记,谢谢
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata)
VALUES
(N'<item>Number One</item><item>Number Two</item><item>Number Three</item>')
, (N'<item>Number One_2</item><item>Number Two_2</item><item>Number Three_2</item>');
-- DDL and sample data population, end

DECLARE @separator CHAR(1) = ',';

SELECT ID, xmldata
    , xmldata.query('for $i in /item
        (: Node Comparison Operator - is :)
        return if ($i is (/item[last()])[1]) then string($i/text()[1])
                else concat($i, sql:variable("@separator"))')
    .value('.', 'NVARCHAR(MAX)') AS [Comma_separated_list]
FROM @tbl;
+----+--------------------------------------------+
| ID |            Comma_separated_list            |
+----+--------------------------------------------+
|  1 | Number One, Number Two, Number Three       |
|  2 | Number One_2, Number Two_2, Number Three_2 |
+----+--------------------------------------------+
SELECT 
    t.pin,
    STUFF(@xml.query('for $I in /item return concat('','', $I)').value('.', 'nvarchar(max)'), 1, 1, '')   AS 'items'
FROM
    table