Как разделить значения, разделенные запятыми, хранящиеся в узле XML, и отобразить их как отдельные записи, не используя функцию - SQL Server 2012 - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть требование разделить данные CSV внутри столбца узла XML и отобразить их в виде отдельных записей.Я использую SQL Server 2012. Я хочу запрос без создания функции.

Данные приведены, например,

ID : 1  
XMLvalue : <BETA>
  <SERIAL NAME="ASSESSMENT"> ASSESSMENT=1,ASSESSMENT=2,ASSESSMENT=3</SERIAL>

<SERIAL NAME="PROJECT"> PROJECT=1,PROJECT=2,PROJECT=3</SERIAL>
</BETA>

ID : 2
XMLvalue : <BETA>
  <SERIAL NAME="ASSESSMENT"> ASSESSMENT=4,ASSESSMENT=5,ASSESSMENT=6</SERIAL>

<SERIAL NAME="PROJECT"> PROJECT=4,PROJECT=5,PROJECT=6</SERIAL>
</BETA>

ID : 3
XMLvalue : <BETA>
  <SERIAL NAME="ASSESSMENT"> ASSESSMENT=7,ASSESSMENT=8,ASSESSMENT=9</SERIAL>

<SERIAL NAME="PROJECT"> PROJECT=7,PROJECT=8,PROJECT=9</SERIAL>
</BETA>

Вывод должен быть следующим:

ID     Assessment/PROJECT

1      ASSESSMENT=1    

1      ASSESSMENT=2    

1      ASSESSMENT=3    

2      ASSESSMENT=4    

2      ASSESSMENT=5    

2      ASSESSMENT=6    

3      ASSESSMENT=7    

3      ASSESSMENT=8    

3      ASSESSMENT=9    

1     PROJECT=1

1    PROJECT=2

1   PROJECT=3

2   PROJECT=4

2   PROJECT=5

2   PROJECT=6

3   PROJECT=7

3   PROJECT=8

3   PROJECT=9

Я хочу получить вышеуказанный вывод без создания функции и только с использованием запроса.Мне не удалось создать скрипту SQL, поэтому ниже приводятся инструкции create и insert.

CREATE TABLE Chart (StoreID int PRIMARY KEY,
                    XMLvalue xml);

INSERT INTO Chart
VALUES (1, '<BETA>
      <SERIAL NAME="ASSESSMENT"> ASSESSMENT=1,ASSESSMENT=2,ASSESSMENT=3</SERIAL>

    <SERIAL NAME="PROJECT"> PROJECT=1,PROJECT=2,PROJECT=3</SERIAL>
    </BETA>');

INSERT INTO Chart
VALUES (2, '<BETA>
      <SERIAL NAME="ASSESSMENT"> ASSESSMENT=4,ASSESSMENT=5,ASSESSMENT=6</SERIAL>

    <SERIAL NAME="PROJECT"> PROJECT=4,PROJECT=5,PROJECT=6</SERIAL>
    </BETA>');

INSERT INTO Chart
VALUES (3, '<BETA>
      <SERIAL NAME="ASSESSMENT"> ASSESSMENT=7,ASSESSMENT=8,ASSESSMENT=9</SERIAL>

    <SERIAL NAME="PROJECT"> PROJECT=7,PROJECT=8,PROJECT=9</SERIAL>
    </BETA>');

Это продолжение моего предыдущего поста. Как разделить значения, разделенные запятыми, хранящиеся в узле XML Без использования функции - SQL Server 2012

Обратите внимание, что выходные данные обоих требований различны.

1 Ответ

0 голосов
/ 12 декабря 2018

Возможно, это немного чище, чем в предыдущем посте

Пример

Select A.ID
      ,C.*
 From  Chart A
 Cross Apply (
                Select Item   = x.v.value('@NAME','VARCHAR(max)')
                      ,Value  = x.v.value('.[1]','VARCHAR(max)')
                 From  XMLvalue.nodes('/BETA/*') x(v)
             ) B
 Cross Apply (
                Select RetSeq = Row_Number() over (Order By (Select null))
                      ,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
                From  (Select x = Cast('<x>' + replace((Select replace(B.Value,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                Cross Apply x.nodes('x') AS B(i)
             ) C

Возвращает

ID  RetSeq  RetVal
1   1       ASSESSMENT=1
1   2       ASSESSMENT=2
1   3       ASSESSMENT=3
2   1       ASSESSMENT=4
2   2       ASSESSMENT=5
2   3       ASSESSMENT=6
3   1       ASSESSMENT=7
3   2       ASSESSMENT=8
3   3       ASSESSMENT=9
1   1       PROJECT=1
1   2       PROJECT=2
1   3       PROJECT=3
2   1       PROJECT=4
2   2       PROJECT=5
2   3       PROJECT=6
3   1       PROJECT=7
3   2       PROJECT=8
3   3       PROJECT=9

РЕДАКТИРОВАТЬ -

Используйте OUTER APPLY, если вы хотите увидеть значения NULL.

...