T-SQL XML修改语法使用变量动态设置标签

时间:2018-12-11 09:41:29

标签: xml tsql

在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")]')

但出现此错误:

  

消息2226,级别16,状态1,第44行XQuery [modify()]:目标   找到的“插入”必须是单个节点   'element(ParameterValue,xdt:untyped)*'

1 个答案:

答案 0 :(得分: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"))传入要成为其前任节点的节点。