Som nævnt i kommentarerne kan du ikke sætte GO
midt i en gruppe af SQL-sætninger, der er afhængige af hinanden, fordi:
-
GO
angiver slutningen af en kompileret batch og begyndelsen af den næste. De fleste sætningskontekster (som enIF..ELSE
) kan ikke spænde over enGO
. Og, -
GO
er ikke engang en SQL-sætning, det er en Management Studio/SQLCMD-kommando, så den vil ikke blive genkendt andre steder.
Din situation er et almindeligt behov, men der er ikke én enkelt løsning. For det specifikke tilfælde, du nævner, er brug af Dynamic SQL sandsynligvis den bedste tilgang:
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'
Dette udnytter det faktum, at dynamiske SQL-udsnit hver udgør deres eget batch til begge at erstatte GO
s effekt (start af en ny batch) og for at isolere de ejendommelige interaktioner af USE
med compileren. Det er selvfølgelig meget klodset på grund af behovet for at "dobbelt-indpakke" ting efter USE..GO
kommandoer.
Bemærk også, at på grund af denne dobbeltindpakning skal alle strenge inde i den være firedobbelt citeret.