Както е отбелязано в коментарите, не можете да поставите GO
в средата на група от SQL изрази, които са зависими един от друг, защото:
-
GO
показва края на един компилиран пакет и началото на следващия. Повечето контексти на изрази (катоIF..ELSE
) не може да обхващаGO
. И, -
GO
дори не е SQL израз, а е команда на Management Studio/SQLCMD, така че няма да бъде разпозната никъде другаде.
Вашата ситуация е обща нужда, но няма едно единствено решение. За конкретния случай, който изброявате, използването на 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'
Това използва факта, че всяко изпълнение на Dynamic SQL представлява своя собствена партида, за да замести GO
s ефект (стартиране на нова партида) и за изолиране на особените взаимодействия на USE
с компилатора. Много е тъпо, разбира се, поради необходимостта от "двойно опаковане" на нещата след USE..GO
команди.
Имайте предвид също, че поради това двойно опаковане всички низове вътре в него ще трябва да бъдат поставени в четворни кавички.