2016-11-16 4 views
1

Aus verschiedenen Gründen versuche ich ein dynamisches Skript zu erstellen, um Tabellen zu löschen, die ich zuvor erstellt habe. Ich konnte die Syntax nicht richtig machen und brauche dafür Hilfe.So erstellen Sie sp_executesql, um Tabellen dynamisch zu löschen

Wenn ich mein Skript ausführen, gibt es den Fehler:

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

und das ist mein Skript. Es hat einen Fehler in sp_executesql Aussage, denke ich. Wie kann ich das beheben?

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

Wie haben Sie diese globale temporäre Tabelle überhaupt erstellt? Auch dynamisch? – Squirrel

Antwort

2

Sie können dies nicht mit statischem SQL tun, d. H. Ein Tabellenname kann niemals ein Parameter in solchen SQL-Anweisungen sein. Dies gilt auch für die Spaltennamen, Schemanamen usw.

Wenn Sie dies mit sp_executesql tun möchten, können Sie die SQL dynamisch aufbauen können wie folgt:

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

EXEC sp_executesql @sql; 

PS: Der @stmt Parameter Die sp_executesql Prozedur muss vom Typ NVARCHAR(...) sein.

+0

vielen Dank, Sie haben Recht –

0

die folgende Abfrage Versuchen: -

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

Ich brauche sp_executesql, weil ich INSERT statemtn anstelle von DROP –

+0

@Mansoor verwenden könnte was ist der Zweck von '@ tmpTableName' in der dynamischen Abfrage? Es wird überhaupt nicht verwendet – Squirrel

1

Die sp_executesql erfordert nvarchar für die @stmt und @params Parameter

so die Daten ändern Typen von Variablen varchar bilden sein nvarchar folgend

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

Ich habe das bereits getan, aber jetzt heißt es "Falsche Syntax in der Nähe von '@ tmpTableName'." –

Verwandte Themen