如何创建 sp_executesql 以动态删除表

How to create sp_executesql to drop tables dynamicaly

出于某些原因,我正在尝试创建一个动态脚本来删除我之前创建的表。我无法正确使用语法,我需要这方面的帮助。

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

"Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'."

这是我的脚本。我猜它在 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;

尝试以下查询:-

    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 

sp_executesql @stmt 和@params 参数需要 nvarchar

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

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

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

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

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

EXEC sp_executesql @sql;

PS: sp_executesql 过程的 @stmt 参数需要是 NVARCHAR(...).

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

EXEC sp_executesql @sql;