用transact-sql替换多个属性 - XML

时间:2010-07-06 11:31:45

标签: sql-server xml tsql

如果你有这个xml

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

是否可以在一个查询中将所有ID从5替换为6?

使用此sql,只能替换当时的一个属性:

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

从sql docs我可以看到,replace应该返回一个原子节点,只有一个,那么还有另外一种方法吗?

2 个答案:

答案 0 :(得分:1)

我最后一次调查时,没有这样的方法 - 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

它不漂亮,但它有效。

答案 1 :(得分:1)

While(@Maxcount <> 0)
BEGIN
        SET @myDoc.modify(' 
          replace value of (//Asset/@id)[sql:variable("@Maxcount")] 
          with     sql:variable("@BinaryAssetId") 
        ') 
        SET @MaxCount = @MaxCount - 1
END