XML столбец в несколько столбцов с разделенной запятой в SQL Server - PullRequest
0 голосов
/ 25 сентября 2019

Использование Sql Server 2012

У меня есть таблица с одним полем в строке, содержащая формат xml, как показано ниже,

a
----
<data1>11</data1><data2>4</data2><data1>12</data1><data2>5</data2>

Я хочу таблицу результатов с отдельной запятой для каждого столбца, как этот

data1|data2
-----------
11,12|4,5

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Вот твой сценарий.Ваш столбец a не является допустимым типом XML, поэтому мне нужно добавить его в качестве корневого элемента.

declare @strxml xml = concat('<t>', '<data1>11</data1><data2>4</data2><data1>12</data1><data2>5</data2>', '</t>')

SELECT
        STUFF((SELECT ',' + b.dat.value('.', 'NVARCHAR(MAX)')
               FROM   tmp.node.nodes('data1') b (dat)
               FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),
              1, 1, '') AS a,

        STUFF((SELECT ',' + a.dat.value('.', 'NVARCHAR(MAX)')
               FROM   tmp.node.nodes('data2') a (dat)
               FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),
              1, 1, '') AS b
FROM @strxml.nodes('/t') tmp(node);

, применяя вашу таблицу.просто замените test3 и yourcolumn

SELECT
        STUFF((SELECT ',' + b.dat.value('.', 'NVARCHAR(MAX)')
               FROM   tmp.node.nodes('data1') b (dat)
               FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),
              1, 1, '') AS a,

        STUFF((SELECT ',' + a.dat.value('.', 'NVARCHAR(MAX)')
               FROM   tmp.node.nodes('data2') a ( dat )
               FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),
              1, 1, '') AS b
FROM test3 t
CROSS APPLY (select cast(concat('<t>', yourcolumn, '</t>') AS xml)) as t1(X)
CROSS APPLY t1.X.nodes('t') AS tmp(node)
0 голосов
/ 25 сентября 2019
DECLARE @XMLData XML 
SET @XMLData = '<a> 
                <data1>11</data1><data2>4</data2><data1>12</data1><data2>5</data2>
            </a>'

SELECT REPLACE
(
    @XMLData.query('data(a/data1)').value('.','varchar(100)')
    ,' ' -- replace the white spaces
    ,',' -- replace the white spaces with commas
) AS data1,

REPLACE
(
    @XMLData.query('data(a/data2)').value('.','varchar(100)')
    ,' '
    ,','
) AS data2

ИЛИ

Если у вас нет Root

DECLARE @XMLData XML 
SET @XMLData = ' 
                <data1>11</data1><data2>4</data2><data1>12</data1><data2>5</data2>
            '

SELECT REPLACE
(
    @XMLData.query('data(data1)').value('.','varchar(100)')
    ,' ' -- replace the white spaces
    ,',' -- replace the white spaces with commas
) AS data1,

REPLACE
(
    @XMLData.query('data(data2)').value('.','varchar(100)')
    ,' '
    ,','
) AS data2

Примечание: -

1. Сначала у нас есть значение, разделенное пробелами ...

2. Для достижения нашей цели мы можем использовать функцию замены для заменыпробелы с запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...