2016-11-16 129 views
1

由於某些原因,我想創建一個動態腳本來刪除我之前創建的表。我無法做正確的語法,我需要幫助這個問題。如何創建sp_executesql刪除表動態

當我運行我的腳本,它給人的錯誤:

"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; 
+0

你是怎麼在第一時間創建全局臨時表的?還動力? – Squirrel

回答

2

你不能用靜態SQL來做到這一點,即一個表名永遠不能成爲這些SQL語句中的參數。這也是列名,模式名稱等

如果你想用這個來sp_executesql做,可以動態生成SQL真如下:

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

EXEC sp_executesql @sql; 

PS:的@stmt參數程序需要爲NVARCHAR(...)

+0

非常感謝你,你是對的 –

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 
+0

我需要使用sp_executesql,因爲我可能使用INSERT statemtn而不是DROP –

+0

@Mansoor動態查詢中「@ tmpTableName」的用途是什麼?它根本沒有使用 – Squirrel

1

sp_executesql需要的@stmt爲nvarchar和@params參數

所以更改數據類型的變量形成varcharnvarchar如下

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

我已經這樣做了,但現在它說「附近'@tmpTableName'語法不正確。」 –