8

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

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

4

3 回答 3

6

我不认为你很幸运,Thx。

我尝试了几种语法变体,但没有任何乐趣。例如,显而易见的:

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

产量:

在 SET 子句中多次指定列名“MyXmlColumn”。在同一个 SET 子句中,一个列不能被分配多个值。修改 SET 子句以确保一列只更新一次。如果 SET 子句更新视图的列,则列名“MyXmlColumn”可能会在视图定义中出现两次。

但是对于 XML DML 空间中的此错误消息没有任何帮助。

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

即使是最彻底的讨论也最终会循环播放……

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

对不起。:(

PS:如果你能忍受hackiness,转换为 VARCHAR(MAX) 然后做一个正常的 REPLACE() 应该可以解决问题。请参阅:我可以在 t-sql 中进行查找/替换吗?

于 2011-09-07T00:39:48.620 回答
2

不可以,如文档中所述,replace value of一次只能在单个节点上运行。据我所知,没有解决方法。您需要使用 2 个更新语句。

于 2011-09-07T00:14:03.237 回答
1

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

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

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
于 2016-07-20T16:50:18.083 回答