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

Откуда:
Сообщений: 77
Доброго времени суток!

Имеется таблица с xml-столбцом "Data" следующего типа:
<data><field id="32">зарегистрирован</field><field id="239"/><field id="240">Клиент</field><field id="241"/></data>


Мне необходимо сделать следующее:
Если id240 = 'Клиент', тогда id241 = '209' и id240 почистить.
Если id240 = 'ББ', тогда id241 = '202' и id240 почистить.
А если id240 не равен ни 'Клиент', ни 'ББ', тогда id241 = '208'

Помогите пожалуйста сформировать запрос.
29 ноя 14, 14:44    [16924060]     Ответить | Цитировать Сообщить модератору
 Re: работа с XML-данными  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+ гавнакод

create table #t(x xml);
go

insert into #t(x) values(N'<data><field id="32">зарегистрирован</field><field id="239"/><field id="240">Клиент</field><field id="241"/></data>');
insert into #t(x) values(N'<data><field id="32">зарегистрирован</field><field id="239"/><field id="240">ББ</field><field id="241"/></data>');
insert into #t(x) values(N'<data><field id="32">зарегистрирован</field><field id="239"/><field id="240">ЗЗ</field><field id="241"/></data>');
insert into #t(x) values(N'<data><field id="32">зарегистрирован</field><field id="239"/><field id="240">АА</field><field id="241"/></data>');
go

update #t set x.modify
(

'       
	insert 
       if ((/data/field[@id = 240]/text())[1] eq "Клиент") then
         text{"209"}
       else
          if ((/data/field[@id = 240]/text())[1] eq "ББ") then
			text{"202"}
		  else
			text{"208"}
	into (/data/field[@id = 241])[1]
');

update #t set x.modify
(

'       
	delete (/data/field[@id = 240]/text())[1]
')
where
	x.exist('/data/field[@id = 240]/text()[. = ("Клиент", "ББ") ]') = 1;

select * from #t;

drop table #t;
go

29 ноя 14, 16:24    [16924378]     Ответить | Цитировать Сообщить модератору
 Re: работа с XML-данными  [new]
Pim.
Member

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

Спасибо большое! Работает!
29 ноя 14, 17:42    [16924686]     Ответить | Цитировать Сообщить модератору
 Re: работа с XML-данными  [new]
Pim.
Member

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

А как сделать, чтобы он в случае, если id240 - пустое, с id241 ничего не делал?

Код
insert
if ((/data/field[@id = 240]/text())[1] eq "") then
text{""}

не работает, точнее он не видит таким запросом пустую строку 240
29 ноя 14, 18:16    [16924843]     Ответить | Цитировать Сообщить модератору
 Re: работа с XML-данными  [new]
Pim.
Member

Откуда:
Сообщений: 77
При том, что запрос

SELECT Id
FROM Task
WHERE
Data.value('(/data/field[@id = 240])[1]', 'varchar(100)')=''


результаты выдает.

Прописав
else
          if ((/data/field[@id = 240]/text())[1] eq "") then
text{""}
		  else
			text{"208"}
	into (/data/field[@id = 241])[1]

Он во все пустые ставит 208
29 ноя 14, 18:18    [16924856]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить