【问题标题】:Use SQL local variable for a XML Node对 XML 节点使用 SQL 局部变量
【发布时间】:2016-03-22 13:39:51
【问题描述】:

我正在尝试将 XML.modify 函数中的局部变量作为我的 SQL 脚本中的节点传递,因为尝试修改的 xml 是动态的。 见下面的代码

DECLARE
    @XML VARCHAR(MAX) = 'ns:Messages/ns:T001.0_NewSPIDRequests/ns:T001.0_NewSPIDRequest/ns:D2009_SWConnectionRef'

;WITH XMLNAMESPACES('urn:bridgeall-com:cmaservice:data:v3' AS ns)
UPDATE XMLMessageFeeder
SET theXML.modify('replace value of (/ns:Submission/*[local-name(.) = sql:variable("@XML")]/text())[1] with ("New Value")')

SELECT theXML 
FROM XMLMessageFeeder

我遇到的问题是,如果我将替换设置如下,则上述内容还没有更新该节点的值:

SET theXML.modify
             ('
                   replace value of (/ns:Submission/ns:Messages/ns:T001.0_NewSPIDRequests/ns:T001.0_NewSPIDRequest/ns:D2009_SWConnectionRef/text())[1]
                  with ("New Value")
             ')

这行得通。据我所知(很少),它们都传递了相同的替换代码,但使用变量似乎不起作用。

有人能指出正确的方向吗?

编辑 答案可以在下面的 cmets 中找到。

【问题讨论】:

    标签: sql sql-server xml xsd


    【解决方案1】:

    local-name(.) 返回当前节点的名称。您不能使用local-name(.) 与路径表达式进行比较。一次只有一个节点。

    【讨论】:

    • 所以在一个变量中包含所有节点基本上是死路一条?我必须有多个变量,其中包含我正在寻找的每个单独的节点。 EG Variable1 = T001.0_NewSPIDRequests, Variable2 = T001.0_NewSPIDRequest 等,然后在替换值中具有类似于 (/ns:Submission/ns:Messages/ns:*[local-name() = sql:variable("@Variable1")]/ns:*[local-name() = sql:variable("@Variable2")] 的内容
    • @Blahwoo 是的。您可以使用多个变量来执行此操作,但您必须事先确定路径的深度(在您的情况下看起来像四个)。您当然可以动态构建更新语句并使用 sp_executesql 执行。或者,如果最终的叶节点名称足以找到您要查找的节点,您可以使用// 对节点进行深度搜索。类似//*[local-name(.) = sql:.....
    • 谢谢!这对我有很大帮助:)
    • @Blahwoo,我刚刚把你推到了神奇的 15 个代表点之上,所以你也可以在这里投票 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多