SQL 2005,XML DML - 一次更新两个值?
Posted
技术标签:
【中文标题】SQL 2005,XML DML - 一次更新两个值?【英文标题】:TSQL 2005, XML DML - Update Two Values at once? 【发布时间】:2011-11-11 17:59:12 【问题描述】:有没有办法将这两个替换值与 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
【问题讨论】:
查看***.com/questions/7395942/…的答案。 【参考方案1】:我不认为你很幸运,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() 应该可以解决问题。见:Can I do a find/replace in t-sql?
【讨论】:
【参考方案2】:不可以,如文档中所述,replace value of
一次只能在单个节点上运行。据我所知,没有解决方法。您需要使用 2 个更新语句。
【讨论】:
"请注意,被更新的目标最多只能是在路径表达式中通过在表达式末尾添加“[1]”明确指定的一个节点。"我认为这意味着我的 xpath 只能返回 1 个节点,而不是我是否可以有两个语句的替换值,每个语句都针对 1 个节点【参考方案3】:如果您只想更改几个值,可以使用我在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
【讨论】:
以上是关于SQL 2005,XML DML - 一次更新两个值?的主要内容,如果未能解决你的问题,请参考以下文章
深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数