【问题标题】:T-SQL XML Modify Syntax Dynamically set tag using a variableT-SQL XML Modify Syntax 使用变量动态设置标签
【发布时间】:2018-12-11 09:41:28
【问题描述】:

在 SQL 中使用“修改”插入一个 xml 变量,该变量在现有 xml 变量之间包含一个新标签。我已经设法通过硬编码 [5] 让它工作,但我正在尝试动态设置标签应该在哪里的值。下面的例子。我想将 [5] 动态设置为 @TotalNo 变量。我正在尝试计算主题的位置,然后只插入新标签。

以下工作,但其硬编码数字 5,但此值可能会根据不同的示例而改变,因为有时可能不是 CC,因此在这种情况下该值为 4。

@TotalNo 变量包含我需要输入的数字,但不知道如何在这个后面设置它(/ParameterValues/ParameterValue)[5]

 DECLARE @comment XML = '<ParameterValue>
        <Name>Comment</Name>
        <Value>Test Report</Value>
    </ParameterValue>'

DECLARE @XMLSettings XML = '<ParameterValues>
    <ParameterValue>
        <Name>TO</Name>
        <Value>aaa</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>CC</Name>
        <Value>bbb</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>IncludeReport</Name>
        <Value>True</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>RenderFormat</Name>
        <Value>PDF</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>Subject</Name>
        <Value>New Report</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>IncludeLink</Name>
        <Value>False</Value>
    </ParameterValue>
    <ParameterValue >
        <Name>Priority</Name>
        <Value>NORMAL</Value>
    </ParameterValue>

</ParameterValues>'

DECLARE @TotalNo INT
SET @TotalNo = @XMLSettings.value('count(/ParameterValues/ParameterValue)', 'INT')

SET @TotalNo = @TotalNo - 2

SET @XMLSettings.modify('insert sql:variable("@comment") after (/ParameterValues/ParameterValue)[5]')


select @XMLSettings

尝试了以下方法:

SET @XMLSettings.modify('insert sql:variable("@comment") after (/ParameterValues/ParameterValue)[sql:variable("@TotalNo")]')

但得到这个错误:

Msg 2226, Level 16, State 1, Line 44 XQuery [modify()]: 的目标 'insert' 必须是单个节点,找到 'element(ParameterValue,xdt:untyped) *'

【问题讨论】:

    标签: xml tsql


    【解决方案1】:

    如果其余的对你来说没问题,你可以简单地通过改变来解决现有的方法

    SET @ExtensionSettings.modify('insert sql:variable("@comment") after (/ParameterValues/ParameterValue)[sql:variable("@TotalNo")]')
    

    SET @ExtensionSettings.modify('insert sql:variable("@comment") after (/ParameterValues/ParameterValue)[sql:variable("@TotalNo")][1]')
    

    唯一的区别是额外的[1]。这必须是单例,但引擎无法预测上交变量的内容。

    但是如果没有任何外部变量,这会做同样的事情

    SET @XMLSettings.modify('insert sql:variable("@comment") after (/ParameterValues/ParameterValue)[count(/ParameterValues/ParameterValue)-2][1]')
    

    这会将评论放在“主题”后面而不计入任何计数

    SET @XMLSettings.modify('insert sql:variable("@comment") after (/ParameterValues/ParameterValue[Name/text()="Subject"])[1]')
    

    您可以使用已声明的变量 (...ParameterValue[Name/text()=sq:variable("@target")) 传入您想成为前任的节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2021-12-02
      • 2018-05-22
      • 1970-01-01
      • 2019-05-12
      • 2011-04-03
      • 2021-01-04
      相关资源
      最近更新 更多