Несколько значений тега XML в одном столбце с разделителем-запятой - PullRequest
1 голос
/ 19 марта 2020

У меня есть XML, где XML имеет несколько похожих тегов, и я хочу, чтобы это значение нужно было показать в одном столбце с разделителем запятых и вставить в таблицу.

Например:

<test xmlns="http://www.google.com">
<code>a</code>
<code>b</code>
<code>c</code>
</test>

Поскольку XML слишком велик, и я использую OPENXML для выполнения операции и вставки этого значения в конкретную таблицу.

Я выполняю как

insert into table A
(
    code
)
select Code from OPENXML(sometag)
with (
    code varchar(100) 'tagvalue'
)

для XQUERY Я использую что-то вроде этого: 'for $i in x:Code return concat($i/text()[1], ";")', и я хочу то же самое с OPENXML.

Вывод: я хочу значение тега кода в один столбец, например, a, b, c или a / b /c.

Ответы [ 3 ]

2 голосов
/ 19 марта 2020

Поскольку вы находитесь на SQL Server 2017, вы можете использовать STRING_AGG (Transact- SQL) для объединения значений кода, например:

create table dbo.Test (
  someTag xml
);

insert dbo.Test (someTag) values
  ('<test><code>a</code><code>b</code><code>c</code></test>'),
  ('<test><code>d</code><code>e</code><code>f</code></test>');

select [Code], [someTag]
from dbo.Test
outer apply (
  select [Code] = string_agg([value], N',')
  from (
    select n1.c1.value('.', 'nvarchar(100)')
    from someTag.nodes(N'/test/code') n1(c1)
  ) src (value)
) a1;

Что дает. ..

Code    someTag
a,b,c   <test><code>a</code><code>b</code><code>c</code></test>
d,e,f   <test><code>d</code><code>e</code><code>f</code></test>
1 голос
/ 19 марта 2020

Просто небольшая настройка AlwaysLearning (+1)

Пример

Declare @YourTable table (ID int,XMLData xml)
insert Into @YourTable values
(1,'<test><code>a</code><code>b</code><code>c</code></test>')

Select A.ID
      ,B.*
 From @YourTable A
 Cross Apply (
               Select DelimString = string_agg(xAttr.value('.','varchar(max)'),',')
                From  A.XMLData.nodes('/test/*') xNode(xAttr)
             ) B

Возвращает

ID  DelimString
1   a,b,c
0 голосов
/ 19 марта 2020

И просто для полноты, вот метод # 3 с помощью чистого XQuery и выражения FLWOR.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata xml);

INSERT @tbl (xmldata) VALUES
('<test  xmlns="http://www.google.com"><code>a</code><code>b</code><code>c</code></test>'),
('<test  xmlns="http://www.google.com"><code>d</code><code>e</code><code>f</code></test>');
-- DDL and sample data population, end

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

-- Method #3
-- SQL Server 2005 onwards
;WITH XMLNAMESPACES (DEFAULT 'http://www.google.com')
SELECT ID
   , xmldata.query('for $i in /test/code
      return if ($i is (/test/code[last()])[1]) then string($i)
            else concat($i, sql:variable("@separator"))')
   .value('.', 'NVARCHAR(MAX)') AS [Comma_separated_list]
FROM @tbl;

Вывод

+----+----------------------+
| ID | Comma_separated_list |
+----+----------------------+
|  1 | a, b, c              |
|  2 | d, e, f              |
+----+----------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...