【问题标题】:Supply xml element value in modify() method在 modify() 方法中提供 xml 元素值
【发布时间】:2019-03-23 18:48:22
【问题描述】:

我知道如何在 modify() 方法中替换 xml 元素的元素值。这是示例

TSQL Replace value in XML String

我的问题有点不同。以上述链接为例...

UPDATE dbo.TFS_Feedback_New
    SET Details.modify('
        replace value of (/optional/educational/text())[1]
        with sql:variable("@updatedEducation")')
    WHERE feedbackID = @FBID

我想做的是为“教育”提供价值。换句话说,我想做这样的事情

UPDATE dbo.TFS_Feedback_New
SET Details.modify('
        replace value of (/optional/sql:variable("@name")/text())[1]
        with sql:variable("@value")')
WHERE feedbackID = @FBID

由于sql:variable("@name"),我收到以下错误

不支持 XQuery 语法“/function()”。

如何将要更新的元素的名称及其值传递给我的 存储过程并让它更新 XML 列?

【问题讨论】:

  • 下次请提供一个独立场景,至少是一个(简化的!)XML 示例,谢谢!

标签: sql-server xml tsql sql-server-2016


【解决方案1】:

您不能将变量用作XPath 的一部分,但您可以使用谓词:

DECLARE @xml XML=
N'<root>
    <optional>
        <educational>SomeText</educational>
        <someOther>blah</someOther>
    </optional>
  </root>';

--你所知道的直接方法:

SET @xml.modify('replace value of (/root/optional/educational/text())[1] with "yeah!"');

SELECT @xml;

--现在我们使用一个变量来找到&lt;optional&gt;下面的第一个节点,它的名字是给定的:

DECLARE @ElementName VARCHAR(100)='educational';

SET @xml.modify('replace value of (/root/optional/*[local-name()=sql:variable("@ElementName")]/text())[1] with "yeah again!"');

SELECT @xml;

试试看……

【讨论】:

  • 太棒了!太感谢了。但现在我有一个微妙的问题。如果节点存在,我想替换它,如果它不我想插入。所以我知道如何插入,但是当我想进行检查时,这会起作用吗 .exist('sql:variable("@token") where @token 'is/root/optional/educational'。因为它不是检测
  • @griftopia 遗憾的是,这不是一个微妙的问题...没有one-liner-approach。在大多数情况下,人们使用一些IF-approach:检查存在并切换到适当的代码。很多时候人们在任何情况下都将节点插入到您想要更改的节点之前并删除第二个节点......
  • @griftopia 抱歉,没有仔细阅读您的评论(或者您稍后编辑了它,-)),不,您不能将Xpath 作为变量插入.exist()。另一个技巧是动态创建整个语句并使用EXEC 执行。这允许使用变量构建 Xpath 并仍然执行带有文字 Xpath... 的语句
  • 首先,我似乎无法在 cmets 中包含多行,否则我的问题会更清楚。其次,是的,我明白你对 EXEC 的看法,但如果可能的话,我想避免使用 EXEC 或 sp_executesql。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多