5

在 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'.

可能吗?

谢谢

4

2 回答 2

3

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

| 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。

于 2013-04-10T13:45:54.160 回答
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
于 2013-04-10T10:46:23.197 回答