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 2005数据库 如何操作xml

如何在 SQL Server 2005 中插入值数组?

深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数

SQL

通过 Web 服务将 SQL Server CE 与 SQL Server 2005 同步

如何从 SQL Server 2005 中另一个表中的相应数据更新一个表中的数据