Запятая разделяет запрос поля XML - PullRequest
1 голос
/ 17 марта 2020

Я ищу решение для получения нескольких значений из поля 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 

Используя следующее query:

SELECT 
    t.pin,
    t.items.query('for $I in items return string($I)').value('.', 'nvarchar(max)')  AS 'items'
FROM
    table

Из-за пробела между описаниями элементов я не могу выполнить «замену» результата.

Ответы [ 2 ]

1 голос
/ 17 марта 2020

попробуйте это:

SELECT 
    t.pin,
    STUFF(@xml.query('for $I in /item return concat('','', $I)').value('.', 'nvarchar(max)'), 1, 1, '')   AS 'items'
FROM
    table
1 голос
/ 17 марта 2020

Проверьте это.

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