Som noterat i kommentarerna kan du inte lägga till GO
mitt i en grupp av SQL-satser som är beroende av varandra eftersom:
-
GO
indikerar slutet på en kompilerad batch och början på nästa. De flesta satskontexter (som enIF..ELSE
) kan inte sträcka sig över enGO
. Och, -
GO
är inte ens en SQL-sats, det är ett Management Studio/SQLCMD-kommando, så det kommer inte att kännas igen någon annanstans.
Din situation är ett vanligt behov, men det finns ingen enskild lösning. För det specifika fallet som du listar är det förmodligen det bästa sättet att använda Dynamic SQL:
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'
Detta utnyttjar det faktum att dynamiska SQL-utsnitt var och en utgör sin egen batch för att båda ersätta GO
s effekt (starta en ny batch) och för att isolera de märkliga interaktionerna av USE
med kompilatorn. Det är såklart väldigt klumpigt på grund av behovet av att "dubbellinda" saker efter USE..GO
kommandon.
Observera också att på grund av denna dubbelomslagning måste alla strängar inuti den vara fyrdubbla citattecken.