我正在尝试在其中定义一个带有VARCHAR字符的XML变量......
实施例
DECLARE @number nvarchar(10);
SET @number = '10'
DECLARE @xml XML;
SET @xml =
'
<Root>
<Node> Hello {sql:variable("@number")} </Node>
</Root>
'
但是,问题是您只能将xml变量设置为字符串文字。有没有办法做到这一点?谢谢!
答案 0 :(得分:2)
不确定为什么要这样做。使用+
连接字符串中的变量,然后将其分配给xml
varibale
DECLARE @number NVARCHAR(10);
SET @number = '10'
DECLARE @xml XML;
SET @xml = '
<Root>
<Node> Hello ' + Isnull(@number,'') + ' </Node>
</Root>
'
查看xml
select @xml
结果:
<Root>
<Node> Hello 10 </Node>
</Root>
答案 1 :(得分:2)
DECLARE @number nvarchar(10) = '10';
DECLARE @xml XML = N'';
SELECT @xml = @xml.query('
<Root>
<Node>Hello {sql:variable("@number")}</Node>
</Root>
');
SELECT @xml;
/*
<Root>
<Node>Hello 10</Node>
</Root>
*/
答案 2 :(得分:1)
在我看来,现有的答案(赞成和接受)并不是一条好路。应该(几乎)永远不会通过字符串连接创建XML ...
为什么不是简单的方法?让XML引擎努力工作!
DECLARE @number nvarchar(10);
SET @number = '10'
DECLARE @xml XML=(SELECT 'Hello ' + @number FOR XML PATH('Node'),ROOT('Root'),TYPE);
SELECT @xml;
返回
<Root>
<Node>Hello 10</Node>
</Root>
想象一下,你的(字符串!)变量包含一些带有禁用字符的文本(><&
或qoutes或许多特殊/远东/任意字符之一)......使用FOR XML ...
将隐式为你做所有的逃避......
一个副作用:如果您的变量为NULL
,则不会获得所有的NULL
,而是一个空节点的有效XML:
<Root>
<Node />
</Root>