2016-12-29 32 views

回答

0

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

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; 
相关问题