如何创建sp_executesql以动态删除表

时间:2016-11-16 07:06:54

标签: sql sql-server sp-executesql

由于某些原因,我试图创建一个动态脚本来删除我之前创建的表。我无法正确使用语法,我需要帮助解决这个问题。

当我运行我的脚本时,它会给出错误:

  

“过程需要'ntext / nchar / nvarchar'类型的参数'@statement'。”

这是我的剧本。我想,它在sp_executesql语句中有错误。我该如何解决这个问题?

DECLARE @sql VARCHAR(MAX);
DECLARE @tmpTableName VARCHAR(max);
SET @tmpTableName = '##gmAAA_COLLATION';

SET @sql = 'DROP TABLE @tmpTableName';

EXEC sp_executesql @sql, N'@tmpTableName NVARCHAR(max)', @tmpTableName;

4 个答案:

答案 0 :(得分:3)

您无法使用静态SQL执行此操作,即表名永远不能成为SQL语句中的参数。对于列名,模式名称等也是如此。

如果要使用sp_executesql执行此操作,可以按如下方式动态构建SQL:

SET @sql = 'DROP TABLE '+QUOTENAME(@tmpTableName);

EXEC sp_executesql @sql;

PS:@stmt程序的sp_executesql参数必须是NVARCHAR(...)类型。

答案 1 :(得分:2)

SET @sql = 'DROP TABLE '+@tmpTableName;

EXEC sp_executesql @sql;

答案 2 :(得分:1)

sp_executesql要求nvarchar用于@stmt和@params参数

所以将varchar变量的数据类型更改为nvarchar,如下所示

DECLARE @sql NVARCHAR(MAX);
DECLARE @tmpTableName VARCHAR(max);

答案 3 :(得分:0)

尝试以下查询: -

    SET @sql = 'DROP TABLE @tmpTableName'; EXEC (@sql)

OR

DECLARE @sql NVARCHAR(MAX);
DECLARE @tmpTableName NVARCHAR(max)
SET @tmpTableName = '##gmAAA_COLLATION';


SET @sql = 'DROP TABLE'+QUOTENAME(@tmpTableName);

EXEC sp_executesql @sql,N'@tmpTableName NVARCHAR(max)',@tmpTableName