У меня есть столбец SQL Server XML с такими данными:
<History>
<Entry>
.....
</Entry>
<Entry>
.....
</Entry>
</History>
Мне нужно добавить уникальный идентификатор для каждого элемента Entry, чтобы получить такой результат:
<History>
<Entry entryID="AAA">
.....
</Entry>
<Entry entryID="BBB">
.....
</Entry>
</History>
У меня он работает для первого вхождения элемента Entry, но я не знаю, как применить его ко всем вхождениям. Кроме того, этот entryID является GUID, и я не знаю, как создать новый для каждой строки.
Вот как я обновляю первый элемент.
declare @eventId varchar(64)
set @eventId = CONVERT(varchar(64),NEWID())
update Histories
set XmlHistory.modify('
insert attribute EntryID {sql:variable("@eventId")}
into (History/Entry)[1]
')
where HistoryID=285162
У меня также есть запрос, который выбирает элементы, которые нуждаются в этом атрибуте, и еще не имеют его. Это дает первичный ключ и элемент, который мне нужно обновить. Я не могу получить уникальный идентификатор элемента для использования в индексе массива элементов.
select h.id rowPK, m.c.query('.') theElement
from TheTable h
cross apply h.XMLColumn.nodes('History/Entry[not(@EntryID)]') m(c)
where XMLColumn.exist('(History/Entry)')= 1