Замена нескольких атрибутов с помощью transact-sql replace - XML - PullRequest
1 голос
/ 06 июля 2010

Если у вас есть этот xml

<AssetComponent name="AssetComponent4881" width="300">
  <Asset id="5" type="1" />
</AssetComponent>
<AssetComponent name="AssetComponent4882" width="300">
  <Asset id="5" type="1" />
</AssetComponent>

Можно ли заменить все идентификаторы от 5 до 6 в одном запросе?

С помощью этого sql можно заменить только один атрибут:

SET @myDoc.modify('
  replace value of (//Asset/@id)[1]
  with     sql:variable("@BinaryAssetId")
')

Из документации sql я вижу, что замена должна возвращать атомарный узел, только один, так есть ли другой способ сделать это?

Ответы [ 2 ]

1 голос
/ 06 июля 2010
While(@Maxcount <> 0)
BEGIN
        SET @myDoc.modify(' 
          replace value of (//Asset/@id)[sql:variable("@Maxcount")] 
          with     sql:variable("@BinaryAssetId") 
        ') 
        SET @MaxCount = @MaxCount - 1
END
1 голос
/ 06 июля 2010

В прошлый раз, когда я изучал это, такого способа не было - replace работает только с одним элементом за раз.(Неприятное) решение, которое я придумал в то время, было (псевдокод) следующим образом:

Предположим, мы хотим изменить записи из одного состояния в другое;давайте назовем эти состояния состоянием «из» (например, имеющим Asset/@id = '5') и состоянием «в» (например, имеющим Asset/@id = '6').Затем выполните этот цикл:

WHILE there exists a record that is in the 'from' state
    BEGIN
    Execute a .modify that changes the first record in the 'from' state 
        to being in the 'to' state
    END

Это не красиво, но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...