Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разбор XML на строки  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Таблица1
ID 	Data 		XML 
1 	12.05.2014      <tbsData>
2 	02.06.2014      <tbsData>
3	06.06.2014	<tbsData>
4	10.07.2014	<tbsData>

Столбец XML таблицы Таблица1, содержит примерно следующий XML код:
      <tbsData>
        <result>
          <client>
            <cred>
              <number>11995</number>
              <date>31.12.2013</date>
            </cred>
            <cred>
              <number>536/3</number>
              <date>07.04.2009</date>
              <guaranteet>
                <last>09.07.2014</last>
              </guarantee>
            </cred>
            <cred>
              <number>16849</number>
              <date>03.10.2010</date>
            </cred>
            ........................
          </client>
        </result>
     </tbsData>


Количество тегов <cred></cred> - может меняться от 1 до 15... (в нашем случае 3)

Тег <guaranteet></guarantee> может быть в коде, но может и не быть (в нашем случае есть только во второй группе тегов <cred></cred>)

Допустим, приведенный XML код принадлежит к ID=1, Таблицы1, тогда должен получится следующий результат:

Таблица2
ID 	Number 		Prizn
1 	11995   	Нет   
1 	536/3      	Да
1	16849		Нет

где:
Столбец ID - это значение ID из Таблица
Столбец Number - это значение тега <number></number> из XML
Столбец Prizn - это признак наличия тэга <guaranteet></guarantee> в XML

Нужно выполнить разбор столбца XML, для всех строк, Таблицы1, и должен получиться результат:
ID 	Number 		Prizn
1 	11995   	Нет   
1 	536/3      	Да
1	16849		Нет
2	153648		Нет
2	481/0		Нет
3	25656		Нет
3	215487		Нет
3	352412		Да
4	95645		Нет

Код написан, но он написан не корректно в виду отсутствия большого опыта и высокого профессионализма, требуется написать код корректно, что бы его можно было использовать как функцию. Спс всем откликнувшимся.
26 авг 14, 14:35    [16494230]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML на строки  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
declare
  @t table (
    id int identity not null,
    [xml] xml not null
  );
insert into @t([xml]) values(N'
      <tbsData>
        <result>
          <client>
            <cred>
              <number>11995</number>
              <date>31.12.2013</date>
            </cred>
            <cred>
              <number>536/3</number>
              <date>07.04.2009</date>
              <guaranteet>
                <last>09.07.2014</last>
              </guaranteet>
            </cred>
            <cred>
              <number>16849</number>
              <date>03.10.2010</date>
            </cred>
          </client>
        </result>
     </tbsData>');
select
  t.id,
  f.n.value('(number/text())[1]', 'varchar(10)') number,
  f.n.exist('guaranteet') Prizn
from @t t
cross apply t.[xml].nodes('/tbsData/result/client/cred') f(n)
26 авг 14, 14:45    [16494303]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML на строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9412
declare @x xml = N'<tbsData>
        <result>
          <client>
            <cred>
              <number>11995</number>
              <date>31.12.2013</date>
            </cred>
            <cred>
              <number>536/3</number>
              <date>07.04.2009</date>
              <guarantee>
                <last>09.07.2014</last>
              </guarantee>
            </cred>
            <cred>
              <number>16849</number>
              <date>03.10.2010</date>
            </cred>
          </client>
        </result>
     </tbsData>';

declare @t table (ID int, [XML] xml);
insert into @t
values
 (1, @x), (2, @x), (3, @x), (4, @x);

select
 t.ID,
 x.n.value('number[1]', 'varchar(100)') as Number,
 case when x.n.exist('guarantee') = 1 then 'Да' else 'Нет' end as Prizn
from
 @t t cross apply
 t.[XML].nodes('/tbsData/result/client/cred') x(n);
26 авг 14, 14:46    [16494306]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML на строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
Aleks_Aleks
Код написан, но он написан не корректно в виду отсутствия большого опыта и высокого профессионализма, требуется написать код корректно, что бы его можно было использовать как функцию. Спс всем откликнувшимся.

Что не хватило недели на "буду сам разбираться" ?
https://www.sql.ru/forum/1111194/peredacha-odnogo-parametra-a-vozvrat-tablicy?hl=
26 авг 14, 14:53    [16494381]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML на строки  [new]
Konst_One
Member

Откуда:
Сообщений: 11540
Aleks_Aleks
Тег <guaranteet></guarantee>



это невалидный XML у вас
26 авг 14, 15:24    [16494662]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML на строки  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Konst_One
это невалидный XML у вас

не well-formed
26 авг 14, 15:30    [16494716]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML на строки  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Сон Веры Павловны,

Ваш метод хорошо работает, и очень хорошо подходит.

ОГРОМНОЕ спасибо Вам за помощь !!!
26 авг 14, 16:25    [16495168]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML на строки  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
invm,

Ваш метод тоже хорошо работает.

И Вам ОГРОМНОЕ спасибо за помощь !!!
26 авг 14, 16:28    [16495192]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить