Удалить элемент из определенной строки в столбце типа XML в SQL? - PullRequest
0 голосов
/ 12 декабря 2018

Предположим, у меня есть следующее:

CREATE TABLE tblData ( [SourceID] int, [SourceRecID] bigint, [Value] xml )
GO

INSERT INTO tblData
VALUES
( 1, 0, N'<attributes><attribute id="58" value="0" /><attribute id="86" value="1" /><attribute id="85" value="1" /><attribute id="70" value="0" /><attribute id="38" value="0" /><attribute id="68" value="0" /><attribute id="42" value="1" /><attribute id="67" value="1" /><attribute id="62" value="1" /></attributes>' ), 
( 1, 686, N'<attributes><attribute id="1" value="0.25" /><attribute id="4" value="1" /><attribute id="10" value="3" /><attribute id="11" value="1" /><attribute id="12" value="6" /></attributes>' ), 
( 1, 687, N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="7" value="1" /><attribute id="9" value="1" /><attribute id="10" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' ), 
( 1, 688, N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="7" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' )
GO

SELECT *
FROM tblData

Допустим, я хотел бы удалить attribute id = 7 из столбца Value, где SourceId = 1, SourceRecID = 687.

Я ожидаю, что новое значение строки SourceId = 1, SourceRecID = 687 будет:

N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="9" value="1" /><attribute id="10" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' ), 

Обратите внимание, что <attribute id="7" value="1" /> теперь отсутствует в исходном xml для этой строки.

Я не могу придумать, как это сделать ...

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете попробовать:

update tblData 
set 
    Value.modify('delete (/attributes/attribute[@id="7"])')
where 
    SourceRecID = 687 and 
    SourceID = 1

XQuery для SQL Server содержит расширение XML DML , позволяющее изменять значения XML.Несколько примеров приведены в Примеры использования XQuery для обновления XML-данных в SQL Server .

Функция modify используется для выполнения запроса XMLDML.В этом запросе ключевое слово delete можно использовать для удаления всех элементов, соответствующих запросу

, используя следующий скрипт:

declare @tblData table ( [SourceID] int, [SourceRecID] bigint, [Value] xml );


INSERT INTO @tblData
VALUES
( 1, 0, N'<attributes><attribute id="58" value="0" /><attribute id="86" value="1" /><attribute id="85" value="1" /><attribute id="70" value="0" /><attribute id="38" value="0" /><attribute id="68" value="0" /><attribute id="42" value="1" /><attribute id="67" value="1" /><attribute id="62" value="1" /></attributes>' ), 
( 1, 686, N'<attributes><attribute id="1" value="0.25" /><attribute id="4" value="1" /><attribute id="10" value="3" /><attribute id="11" value="1" /><attribute id="12" value="6" /></attributes>' ), 
( 1, 687, N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="7" value="1" /><attribute id="9" value="1" /><attribute id="10" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' ), 
( 1, 688, N'<attributes><attribute id="1" value="2.00" /><attribute id="2" value="60.00" /><attribute id="3" value="-1" /><attribute id="5" value="252.00" /><attribute id="6" value="0" /><attribute id="7" value="1" /><attribute id="11" value="2" /><attribute id="12" value="10" /></attributes>' )

Содержимое строки сSourceRecID 687:

<attributes>
  ...
  <attribute id="6" value="0" />
  <attribute id="7" value="1" />
  <attribute id="9" value="1" />
  ...
</attributes>

После выполнения этого запроса:

update tblData 
set Value.modify('delete (/attributes/attribute[@id="7"])')
where [SourceRecID]=687 and SourceID = 1

Содержимое:

...
<attribute id="5" value="252.00" />
<attribute id="6" value="0" />
<attribute id="9" value="1" />
...
...