Jak zauważono w komentarzach, nie możesz umieścić GO
w środku grupy instrukcji SQL, które są od siebie zależne, ponieważ:
-
GO
wskazuje koniec jednej skompilowanej partii i początek następnej. Większość kontekstów instrukcji (takich jakIF..ELSE
) nie może obejmowaćGO
. I, -
GO
nie jest nawet instrukcją SQL, jest to polecenie Management Studio/SQLCMD, więc nie zostanie rozpoznane nigdzie indziej.
Twoja sytuacja jest powszechną potrzebą, ale nie ma jednego rozwiązania. W konkretnym przypadku, który podajesz, prawdopodobnie najlepszym rozwiązaniem jest użycie dynamicznego 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'
Wykorzystuje to fakt, że każde z dynamicznych wykonań SQL stanowi osobną partię, aby zastąpić GO
s (rozpoczęcie nowej partii) i wyizolowanie osobliwych interakcji USE
z kompilatorem. Jest to oczywiście bardzo niezgrabne ze względu na konieczność „podwójnego zawinięcia” rzeczy po USE..GO
poleceń.
Zwróć też uwagę, że z powodu tego podwójnego zawinięcia wszelkie ciągi znaków w środku będą musiały być ujęte w czterocyfrowy cudzysłów.