我正在尝试使用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'.
如果我对表名和列类型进行硬编码(我必须同时执行),那么查询会起作用,否则我会得到这两个变量的错误语法消息。
如果你想知道,我想把这个代码放在一个存储过程中,这样如果有人想创建或修改一个表,那么他们就会调用这个存储过程来运行额外的验证。
答案 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;