如何使用sp_executesql传递表变量

时间:2013-11-22 23:05:39

标签: sql sql-server dynamic-sql sp-executesql

我正在尝试使用sp_executesql创建一个表但是我一直收到一条错误,上面写着“@_TableName附近的语法不正确”。我知道我在这里做错了吗?

这是我正在使用的代码:

DECLARE @SQLString NVARCHAR(MAX), 
        @ParamDefinition NVARCHAR(MAX), 
        @TableName NVARCHAR(MAX);

SET @TableName  = N'[dbo].[MyTable]';

SET @SQLString = N'SELECT * FROM @_TableName;';

SET @ParamDefinition = N'@_TableName NVARCHAR(max)';

EXEC sp_executesql @SQLString, @ParamDefinition, 
                   @_TableName = @TableName;

产生错误:

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

如果我对表名和列类型进行硬编码(我必须同时执行),那么查询会起作用,否则我会得到这两个变量的错误语法消息。

如果你想知道,我想把这个代码放在一个存储过程中,这样如果有人想创建或修改一个表,那么他们就会调用这个存储过程来运行额外的验证。

1 个答案:

答案 0 :(得分:0)

找出问题所在。

显然sp_executesql期望表的参数定义是表类型(请参阅此答案以获取示例:https://stackoverflow.com/a/4264553/21539)。

解决此问题的一种更简单的方法是将变量名称直接插入SQLStatement字符串,如下所示:

DECLARE @SQLString NVARCHAR(MAX), 
        @TableName NVARCHAR(MAX);

SET @TableName  = N'[dbo].[MyTable]';

SET @SQLString = N'SELECT * FROM ' + @TableName + ';';

SET @ParamDefinition = N'@_TableName NVARCHAR(max);

EXEC sp_executesql @SQLString;