【问题标题】:Optimise XML update in T-SQL优化 T-SQL 中的 XML 更新
【发布时间】: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


【解决方案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

--结束

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2016-01-24
    • 1970-01-01
    • 2014-11-04
    • 2017-06-02
    • 2013-11-20
    • 2022-01-24
    相关资源
    最近更新 更多