Wie in den Kommentaren erwähnt, können Sie GO
nicht eingeben inmitten einer Gruppe von SQL-Anweisungen, die voneinander abhängig sind, weil:
-
GO
zeigt das Ende eines kompilierten Stapels und den Beginn des nächsten an. Die meisten Anweisungskontexte (wie einIF..ELSE
) kann keinGO
umfassen . Und, -
GO
ist nicht einmal eine SQL-Anweisung, sondern ein Management Studio/SQLCMD-Befehl, sodass er nirgendwo anders erkannt wird.
Ihre Situation ist ein allgemeines Bedürfnis, aber es gibt keine einzige Lösung. Für den speziellen Fall, den Sie auflisten, ist die Verwendung von Dynamic SQL wahrscheinlich der beste Ansatz:
IF EXISTS(select * from sys.databases where name='MyDB')
BEGIN
EXEC('
USE MyDB
EXEC(''
DROP USER [tester]
.
.
.
'')
')
END
ELSE
PRINT 'MyDB database is not available'
Dies macht sich die Tatsache zunutze, dass dynamische SQL-Ausführungen jeweils einen eigenen Batch darstellen, um beide GO
zu ersetzen s-Effekt (Starten eines neuen Stapels) und um die eigentümlichen Interaktionen von USE
zu isolieren mit dem Compiler. Es ist natürlich sehr klobig, weil Dinge nach dem USE..GO
"doppelt gewickelt" werden müssen Befehle.
Beachten Sie auch, dass aufgrund dieses doppelten Umbruchs alle darin enthaltenen Zeichenfolgen in vier Anführungszeichen gesetzt werden müssen.