Запрос только об изменении значения последней записи на сервере sql - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть таблица в sql -сервер с XML типом данных. Я хочу изменить значение одного из атрибутов. Таблица выглядит следующим образом:

id--------version-------XMLdata
1---------2--------------<Package version="1"> .... </Package>
2---------2--------------<Package version="1"> .... </Package>
3---------2--------------<Package version="1"> .... </Package>
and so on

Я пытаюсь обновить версию внутри XML-данных до 2, например:

id--------version-------XMLdata
1---------2--------------<Package version="2"> .... </Package>
2---------2--------------<Package version="2"> .... </Package>
3---------2--------------<Package version="2"> .... </Package>
and so on

Я выполняю запрос вроде:

UPDATE Tbl
SET XMLDATA.modify('replace value of (/Package[1]/@version)[1] with "2"')
WHERE version=2

Но в выводе я вижу, что только последняя версия получения записи была изменена на 2. Индивидуальную запись я также могу обновить с помощью:

UPDATE Tbl
SET XMLDATA.modify('replace value of (/Package[1]/@version)[1] with "2"')
WHERE id=1

Но не все записи вместе. Я не понимаю, в чем причина этого. Я попытался создать копию таблицы с именем Tbl2, и там запрос обновляет все версии записи в данных XML. Какая может быть возможная зависимость, которая останавливает запрос на изменение значения атрибута версии?

1 Ответ

1 голос
/ 22 апреля 2020

.modify() очень ограничен, он допускает только одно изменение на вызов, но это должно работать как положено. Попробуйте это:

DECLARE @tbl TABLE (id INT,[version] INT, XMLdata XML);
INSERT INTO @tbl VALUES
 (1,2,'<Package version="1"> .... </Package>')
,(2,2,'<Package version="1"> .... </Package>')
,(3,2,'<Package version="1"> .... </Package>');

UPDATE @tbl SET XMLdata.modify('replace value of (/Package/@version)[1] with 2')
WHERE [version]=2;

SELECT * FROM @tbl;

Вы можете использовать sql:column("version") вместо 2 без WHERE, чтобы установить все атрибуты XML -version в syn c со столбцом версии таблицы за один звонок:

UPDATE @tbl SET XMLdata.modify('replace value of (/Package/@version)[1] with sql:column("version")');
...