是否有办法将这两个替换值与一个更新语句结合起来?
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