由于某些原因,我试图创建一个动态脚本来删除我之前创建的表。我无法正确使用语法,我需要帮助解决这个问题。
当我运行我的脚本时,它会给出错误:
“过程需要'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;
答案 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