SQL Server传递变量而不是硬编码根元素名称

时间:2013-04-10 10:37:36

标签: sql sql-server

在SQL Server 2008中,我有查询

DECLARE @root AS varchar(20);
SET @root = 'Root';

DECLARE @element AS varchar(20);
SET @element = 'Element';

SELECT
    *
FROM 
    SomeTable
FOR XML PATH (@element), ROOT(@root);

我想要的是传递变量而不是硬编码重复元素和根的名称。

当我执行查询时,它会抛出此错误:

Msg 102, Level 15, State 1, Line 11
Incorrect syntax near '@element'.

有可能吗?

由于

2 个答案:

答案 0 :(得分:3)

尝试动态SQL -

DECLARE 
  @Root VARCHAR(20)
, @Element VARCHAR(20)
, @SQL NVARCHAR(500)

SELECT 
  @Root = 'Root'
, @Element = 'Element'
, @SQL = N'
 SELECT *
 FROM Labour.Absence a
 FOR XML PATH (''' + @Element + '''), ROOT(''' + @Root + ''')' 

PRINT @SQL

EXEC sp_executesql @SQL

答案 1 :(得分:3)

值得学习阅读SQL Server的文档。如果您查看FOR clause,您会看到:

| PATH [ ( 'ElementName' ) ] 
...
[ , ROOT [ ( 'RootName' ) ] ]

如果您将此与其他文档进行比较,我将在此处使用BACKUP

作为示例
 { 'physical_device_name' | @physical_device_name_var }
...
FILE = { logical_file_name | @logical_file_name_var } 
| FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }

也就是说,当只传递字符串有效时,它们只会在语法图中显示''分隔值。当可以传递变量时,它们会明确地将其显示为一个选项(带有@名称)。当您必须提供名称而不是字符串时,他们会在没有''标记的情况下显示它

因此,正如@Devart所说,唯一的可能是使用动态SQL。

相关问题