2

我正在尝试使用 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'.

如果我对表名和列类型进行硬编码(我必须两者都做),那么查询就可以工作,否则我会得到这两个变量的不正确语法消息。

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

4

1 回答 1

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;
于 2013-11-23T00:20:10.920 回答