powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли массово модифицировать xml в таблице?
9 сообщений из 9, страница 1 из 1
Можно ли массово модифицировать xml в таблице?
    #39810917
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, приветствую!
Никогда ранее не сталкивался с задачей модификации xml, хранящихся в базе.
С наскоку MSDN скурить не удалось. Не могу понять, где лошадь припрягается!
Помогите с примером!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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].
Т.е. для первой строки ожидается:
Код: xml
1.
2.
3.
4.
5.
<a>
  <b>
    <b ss:xml="xml1">1</b>2</b>
  <b>3</b>
</a>
...
Рейтинг: 0 / 0
Можно ли массово модифицировать xml в таблице?
    #39810926
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как ожидается не выйдет без декларации namespace.
Можно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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;
...
Рейтинг: 0 / 0
Можно ли массово модифицировать xml в таблице?
    #39810928
Фотография miltorg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Код: php
1.
2.
3.
4.
5.
6.
7.
#!/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>

Так?
...
Рейтинг: 0 / 0
Можно ли массово модифицировать xml в таблице?
    #39811064
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmКак ожидается не выйдет без декларации namespace.
Можно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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 Вы по этому вопросу не встречали?
...
Рейтинг: 0 / 0
Можно ли массово модифицировать xml в таблице?
    #39811091
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Думаю, что именно по этому вопросу вряд ли что-то найдется, кроме MSDN. XML DML - фича сугубо SQL Server.
...
Рейтинг: 0 / 0
Можно ли массово модифицировать xml в таблице?
    #39811421
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, кстати! Не совсем работает.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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;



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


а получилось:
Код: xml
1.
2.
3.
4.
5.
<a>
  <b xmlns:ss="MySomeNamespace" ss:xml="xml3">
    <b>1</b>1</b>
  <b>4</b>
</a>
...
Рейтинг: 0 / 0
Можно ли массово модифицировать xml в таблице?
    #39811451
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterНе совсем работает.Работает согласно документации -можно модифицировать только один элемент.

Так что придется крутить цикл
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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;
...
Рейтинг: 0 / 0
Можно ли массово модифицировать xml в таблице?
    #39812373
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, спасибо, разобрался!
...
Рейтинг: 0 / 0
Можно ли массово модифицировать xml в таблице?
    #39812628
zzzzzzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterinvm, спасибо, разобрался!
lol
спасибо скопипастил :)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли массово модифицировать xml в таблице?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]