在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'.
有可能吗?
由于
答案 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。