【发布时间】:2014-09-09 15:58:59
【问题描述】:
考虑到下面的错误 - 知道如何优化下面的代码吗?
在 SET 子句中多次指定列名“MyXmlColumn”。在同一个 SET 子句中,一个列不能被分配多个值。修改 SET 子句以确保一列只更新一次。如果 SET 子句更新视图的列,则列名“MyXmlColumn”可能会在视图定义中出现两次。
UPDATE #tempTable
SET MBO.modify('replace value of (/*[local-name()=''configuration'']/*[local-name()=''play'']/text())[1] with "false"')
UPDATE #tempTable
SET MBO.modify('replace value of (/*[local-name()=''configuration'']/*[local-name()=''eat'']/text())[1] with "false"')
UPDATE #tempTable
SET MBO.modify('replace value of (/*[local-name()=''configuration'']/*[local-name()=''work'']/text())[1] with "false"')
UPDATE #tempTable
SET MBO.modify('replace value of (/*[local-name()=''configuration'']/*[local-name()=''kill'']/text())[1] with "false"')
UPDATE #tempTable
SET MBO.modify('replace value of (/*[local-name()=''configuration'']/*[local-name()=''wash'']/text())[1] with "false"')
UPDATE #tempTable
SET MBO.modify('replace value of (/*[local-name()=''configuration'']/*[local-name()=''home'']/text())[1] with "false"')
UPDATE #tempTable
SET MBO.modify('replace value of (/*[local-name()=''configuration'']/*[local-name()=''sleep'']/text())[1] with "true"'),
ToPayment = 1
这是灵魂:这是解决方案:: CREATE FUNCTION [dbo].[SBOObject]
(
-- 在此处添加函数的参数
@var2 XML,
@var1 nvarchar(5),
@var3 nvarchar(5),
)
返回 XML
作为
开始
SET @var2.modify('declare default element namespace "http://schemas.ObjectWorld"; 用 sql:variable("@var1")') 替换 (/configuration/sleep/text())[1] 的值
SET @var2.modify('declare default element namespace "http://schemas.ObjectWorld"; 将 (/configuration/work/text())[1] 的值替换为 sql:variable("@var3")')
RETURN @var2
结束
【问题讨论】:
-
我已经尝试过了,我遇到的最好的方法是基于光标的方法,例如:blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx。或者,您可以将数据分解到关系表中,更新它,然后重建 xml,但这也很丑!
-
海伊伊丽莎白。感谢您的反馈。我已经看到了逻辑。但这对我不起作用,因为我拥有的元素完全不同。谢谢
标签: sql-server xml tsql