【问题标题】:SQL:in XML modify() statement, can you use variable for tag name?SQL:在 XML modify() 语句中,可以使用变量作为标签名称吗?
【发布时间】:2016-12-29 20:18:57
【问题描述】:

我正在尝试做类似的事情:

SET @xml.modify ('插入 @y 到 (/something)[ID="@id"][1]')

我发现当我用 {sql:variable("@y")} 替换 @y 时,它起作用了。 但它不适用于@x。

有没有办法让它工作?

【问题讨论】:

  • @xml.modify ('insert @y@x> into (/something)[ID="@id"][1]')

标签: sql xml variables tags xml.modify


【解决方案1】:

无法插入具有动态名称的元素。看看这些例子:

DECLARE @x XML=
N'<root>
<test>Some test value</test>
</root>';

随心所欲,一切都是固定的文字

SET @x.modify('insert <blah>new element</blah> as first into (/root)[1]')
SELECT @x;

结果

<root>
  <blah>new element</blah>
  <test>Some test value</test>
</root>

动态内容

DECLARE @content NVARCHAR(100)='dynamic content'
SET @x.modify('insert <blah>{sql:variable("@content")}</blah> as first into (/root)[1]');
SELECT @x;

结果

<root>
  <blah>dynamic content</blah>
  <blah>new element</blah>
  <test>Some test value</test>
</root>

这是不允许的,会导致错误

DECLARE @element NVARCHAR(100)='dynElement';
SET @x.modify('insert <{sql:variable("@element")}>{sql:variable("@content")}</{sql:variable("@element")}> as first into (/root)[1]');
SELECT @x;

但您可以在外部创建完整的 XML 元素并将其插入原样

DECLARE @new_element XML='<dynElement>Some dynamic content</dynElement>';
SET @x.modify('insert sql:variable("@new_element") as first into (/root)[1]');
SELECT @x;

结果

<root>
  <dynElement>Some dynamic content</dynElement>
  <blah>dynamic content</blah>
  <blah>new element</blah>
  <test>Some test value</test>
</root>

这将导致相同的结果

DECLARE @new_element XML=(SELECT 'Some dynamic content' FOR XML PATH('dynElement'));
SET @x.modify('insert sql:variable("@new_element") as first into (/root)[1]');
SELECT @x;

而且这 - 完全参数化 - 也会返回相同的

DECLARE @element NVARCHAR(100)='dynElement';
DECLARE @content NVARCHAR(100)='dynamic content'

DECLARE @new_element XML='<' + @element +'>' +  @content + '</' +  @element + '>';

SET @x.modify('insert sql:variable("@new_element") as first into (/root)[1]');
SELECT @x;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2021-07-28
    • 2021-06-25
    • 2017-02-27
    • 2017-11-12
    • 1970-01-01
    相关资源
    最近更新 更多