由于某些原因,我试图创建一个动态脚本来删除我之前创建的表。我不能做正确的语法,我需要帮助这件事。
当我运行脚本时,它给出了错误:
"过程期望参数'@statement'类型为'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;
你不能在静态SQL中这样做,即表名永远不能在这样的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;
sp_executesql需要对@stmt和@params参数使用nvarchar
因此将varchar
变量的数据类型更改为nvarchar
,如下所示
DECLARE @sql NVARCHAR(MAX);
DECLARE @tmpTableName VARCHAR(max);
尝试以下查询:-
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