我正在寻找一种解决方案,以逗号分隔符从XML字段中获取多个值。
例如:我有一个表,该表是一个引脚和一个XML字段。
1,<item>Number One</item><item>Number Two</item><item>Number Three</item>
我想看到的结果是:
1, Number One, Number Two, Number Three
使用以下代码,我可以获得以下结果:
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
-- 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