2013-11-22 28 views
2

我正在尝试使用sp_executesql创建表,但我不断收到一个错误消息,提示“附近的'@_TableName'语法不正确,有任何想法我在这里做错了吗?如何使用sp_executesql传递表变量

下面是我使用的代码:

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

想通了这个问题。

显然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; 
+3

很不幸,这会让你容易受到SQL注入攻击,如果@tablename从用户输入的到来。这个答案解释了如何解决这个问题:http://stackoverflow.com/a/1246848/109122 – RBarryYoung