TSQL 2005, XML DML -一次更新两个值



是否有办法将这两个替换值与一个更新语句结合起来?

UPDATE dbo.MyTable
SET MyXmlColumn.modify('replace value of (/node/@att1)[1] with "1"')
WHERE id = 1
UPDATE dbo.MyTable
SET MyXmlColumn.modify('replace value of (/node/@att2)[1] with "2"')
WHERE id = 1

http://msdn.microsoft.com/en-US/library/ms190675 (v = SQL.90) . aspx

我觉得你运气不好,谢谢。

我尝试了几种语法变体,但都不满意。例如,显而易见的:

SET MyXmlColumn.modify('...'), MyXmlColumn.modify('...')

收益率:

在SET中多次指定列名'MyXmlColumn'条款。不能在同一列中为一个列分配多个值设置条款。修改SET子句以确保列是只更新一次。如果SET子句更新视图的列,则列名'MyXmlColumn'可以在视图中出现两次定义。

但是在XML DML空间中对这个错误消息没有任何帮助。

底线是Expression1 &Expression2必须是单元素

即使是最彻底的讨论最终也会通过它循环…

http://blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx

抱歉。(

PS:如果您可以忍受这种粗糙,那么转换为VARCHAR(MAX),然后执行正常的REPLACE()应该可以解决问题。参见:我可以在t-sql中做查找/替换吗?

不可以,文档中说明replace value of一次只能在单个节点上操作。据我所知,没有解决这个问题的方法。您需要使用2条更新语句

如果您只想更改几个值,可以使用我在sqlservercentral找到的这种方法。它使用一个select语句来获取数据,多次操作数据,并使用一个update语句来更改表数据。

不完美,但在某些用例中可能足够好。基本上,它是循环解决方案的简化版本,用于更改固定数量的值。

DECLARE @temp XML
SET @temp = (SELECT Column_name FROM Table_name WHERE AuthId = @AuthId)
SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueId/text())[1] with sql:variable("@NewValue")') 
SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueName/text())[1] with sql:variable("@NewValue")')
UPDATE Table_name
SET Column_name = @temp
WHERE AuthId = @AuthId

相关内容

  • 没有找到相关文章

最新更新