我有一个创建xml文件的查询。目前,我有ROOT元素硬编码。我想使用变量值来设置此根元素值,但用变量替换硬编码字符串会引发语法错误expecting a string
。这是select语句:
DECLARE @SelectResults XML
DECLARE @DatabaseName varchar(100)
SELECT @DatabaseName = DB_NAME();
SET @SelectResults =
(
SELECT...query results here...
FOR XML PATH(''),
ROOT(@DatabaseName) --when this is set to 'DatabaseName' it works
)
我可以在函数ROOT()
中使用变量吗?
答案 0 :(得分:3)
您可以在单独的替换中对XML输出执行替换:
DECLARE @SelectResults XML
DECLARE @DatabaseName varchar(100)
SELECT @DatabaseName = DB_NAME();
SET @SelectResults =
replace(
SELECT...query results here...
FOR XML PATH(''),
ROOT('ROOT_ELEMENT') --when this is set to 'DatabaseName' it works
), 'ROOT_ELEMENT>',@DatabaseName+'>' )
答案 1 :(得分:2)
使用concat()
这是一个小作弊创建一些示例数据
Declare @SomeTable table (id int,First_Name varchar(50),Last_Name varchar(50),EMail varchar(50))
Insert into @SomeTable values
(1,'John','Smith','john.smith@gmail.com'),
(2,'Jane','Doe' ,'jane.doe@gmail.com')
SQL
Declare @SelectResults XML = concat('<',DB_NAME(),'>',(Select * from @SomeTable for XML Path),'</',DB_NAME(),'>')
Select @SelectResults
<强>返回强>
<Chinrus-Dev>
<row>
<id>1</id>
<First_Name>John</First_Name>
<Last_Name>Smith</Last_Name>
<EMail>john.smith@gmail.com</EMail>
</row>
<row>
<id>2</id>
<First_Name>Jane</First_Name>
<Last_Name>Doe</Last_Name>
<EMail>jane.doe@gmail.com</EMail>
</row>
</Chinrus-Dev>
答案 2 :(得分:1)
不,你不能这样做 ad-hoc
此
SELECT 'test'
FOR XML PATH('x'),ROOT('y')
导致
<y>
<x>test</x>
</y>
但这是不允许的
DECLARE @root NVARCHAR(MAX)='z';
SELECT 'test'
FOR XML PATH('x'),ROOT(@root) <-- error!
您可以动态构建语句
DECLARE @root NVARCHAR(MAX)='z';
DECLARE @cmd NVARCHAR(MAX)=
(
'SELECT ''test''
FOR XML PATH(''x''),ROOT(''' + @root + ''')'
);
EXEC(@cmd);
导致
<z>
<x>test</x>
</z>
但是 - 一如既往 - 动态SQL有一些沉重的缺点......