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

Откуда:
Сообщений: 673
Коллеги, приветствую!
Никогда ранее не сталкивался с задачей модификации xml, хранящихся в базе.
С наскоку MSDN скурить не удалось. Не могу понять, где лошадь припрягается!
Помогите с примером!
Use tempdb
	Create table t (x xml, [name] sysname)

	insert into t (x, [name])
	values(N'<a><b><b>1</b>2</b><b>3</b></a>', 'xml1'),
		  (N'<a><b>4</b><b>3</b><b>1</b></a>', 'xml2'),
		  (N'<a><b><b>3</b>1</b><b>4</b></a>', 'xml3')
drop table t

Необходимо модифицировать xml-и следующим образом:
В случае, если элемент b = 1, то нужно добавить к нему атрибут ss:xml, равный значению поля [name].
Т.е. для первой строки ожидается:
<a>
  <b>
    <b ss:xml="xml1">1</b>2</b>
  <b>3</b>
</a>
7 май 19, 19:52    [21880356]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли массово модифицировать xml в таблице?  [new]
invm
Member

Откуда: Москва
Сообщений: 8714
Как ожидается не выйдет без декларации namespace.
Можно так
declare @t table (x xml, [name] sysname);

insert into @t (x, [name])
values
 (N'<a><b><b>1</b>2</b><b>3</b></a>', 'xml1'),
 (N'<a><b>4</b><b>3</b><b>1</b></a>', 'xml2'),
 (N'<a><b><b>3</b>1</b><b>4</b></a>', 'xml3');

update @t
 set x.modify('declare namespace ss = "MySomeNamespace"; insert attribute ss:xml {sql:column("name")} into (//b[text()="1"])[1]');

select * from @t;
7 май 19, 20:18    [21880376]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли массово модифицировать xml в таблице?  [new]
miltorg
Member

Откуда: Калининград
Сообщений: 365
uaggster,

#!/usr/bin/perl

$_='<a><b><b>1</b>2</b><b>3</b></a>';

s/<b>1<\/b>/<b ss:xml="xml1">1<\/b>/;

print;


Результат работы программы:

perl xml.pl

<a><b><b ss:xml="xml1">1</b>2</b><b>3</b></a>

Так?
7 май 19, 20:24    [21880379]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли массово модифицировать xml в таблице?  [new]
uaggster
Member

Откуда:
Сообщений: 673
invm
Как ожидается не выйдет без декларации namespace.
Можно так
declare @t table (x xml, [name] sysname);

insert into @t (x, [name])
values
 (N'<a><b><b>1</b>2</b><b>3</b></a>', 'xml1'),
 (N'<a><b>4</b><b>3</b><b>1</b></a>', 'xml2'),
 (N'<a><b><b>3</b>1</b><b>4</b></a>', 'xml3');

update @t
 set x.modify('declare namespace ss = "MySomeNamespace"; insert attribute ss:xml {sql:column("name")} into (//b[text()="1"])[1]');

select * from @t;

Да, invm, это именно то, что нужно, спасибо!
Скажите, а чего-нибудь более "для чайников", чем MSDN Вы по этому вопросу не встречали?
8 май 19, 07:50    [21880590]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли массово модифицировать xml в таблице?  [new]
invm
Member

Откуда: Москва
Сообщений: 8714
uaggster,

Думаю, что именно по этому вопросу вряд ли что-то найдется, кроме MSDN. XML DML - фича сугубо SQL Server.
8 май 19, 09:25    [21880643]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли массово модифицировать xml в таблице?  [new]
uaggster
Member

Откуда:
Сообщений: 673
invm, кстати! Не совсем работает.
declare @t table (x xml, [name] sysname);

insert into @t (x, [name])
values
 (N'<a><b><b>1</b>2</b><b>3</b></a>', 'xml1'),
 (N'<a><b>4</b><b>3</b><b>1</b></a>', 'xml2'),
 (N'<a><b><b>1</b>1</b><b>4</b></a>', 'xml3');

update @t
 set x.modify('declare namespace ss = "MySomeNamespace"; insert attribute ss:xml {sql:column("name")} into (//b[text()="1"])[1]');

select * from @t;


В третьем случае ожидается:
<a>
  <b xmlns:ss="MySomeNamespace" ss:xml="xml3">
    <b xmlns:ss="MySomeNamespace" ss:xml="xml3">1</b>1</b>
  <b>4</b>
</a>

а получилось:
<a>
  <b xmlns:ss="MySomeNamespace" ss:xml="xml3">
    <b>1</b>1</b>
  <b>4</b>
</a>
8 май 19, 15:49    [21881261]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли массово модифицировать xml в таблице?  [new]
invm
Member

Откуда: Москва
Сообщений: 8714
uaggster
Не совсем работает.
Работает согласно документации -можно модифицировать только один элемент.

Так что придется крутить цикл
declare @t table (x xml, [name] sysname);

insert into @t (x, [name])
values
 (N'<a><b><b>1</b>2</b><b>3</b></a>', 'xml1'),
 (N'<a><b>4</b><b>3</b><b>1</b></a>', 'xml2'),
 (N'<a><b><b>1</b>1</b><b>4</b></a>', 'xml3');

while 1 = 1
 begin
  update @t
   set x.modify('declare namespace ss = "MySomeNamespace"; insert attribute ss:xml {sql:column("name")} into (//b[text()="1" and not(@ss:xml)])[1]')
  where
   x.exist('declare namespace ss = "MySomeNamespace"; //b[text()="1" and not(@ss:xml)]') = 1;

  if @@rowcount = 0 break;
 end;

select * from @t;
8 май 19, 16:34    [21881325]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли массово модифицировать xml в таблице?  [new]
uaggster
Member

Откуда:
Сообщений: 673
invm, спасибо, разобрался!
13 май 19, 10:20    [21883074]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли массово модифицировать xml в таблице?  [new]
zzzzzzzzzz
Member

Откуда:
Сообщений: 320
uaggster
invm, спасибо, разобрался!

lol
спасибо скопипастил :)
13 май 19, 18:13    [21883654]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить