使用FOR XML PATH的select语句中的ROOT元素是否可以使用变量设置?

时间:2016-09-12 19:24:54

标签: sql-server xml

我有一个创建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()中使用变量吗?

3 个答案:

答案 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!

动态SQL

您可以动态构建语句

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有一些沉重的缺点......