在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)*'
答案 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")
)传入要成为其前任节点的节点。