Conforme observado nos comentários, você não pode colocar
GO
no meio de um grupo de instruções SQL que são dependentes umas das outras porque:-
GO
indica o fim de um lote compilado e o início do próximo. A maioria dos contextos de instrução (como umIF..ELSE
) não pode abranger umGO
. E,
-
GO
nem é uma instrução SQL, é um comando do Management Studio/SQLCMD, então não será reconhecido em nenhum outro lugar.
Sua situação é uma necessidade comum, mas não há uma solução única. Para o caso específico que você listou, usar SQL dinâmico é provavelmente a melhor abordagem:
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'
Isso aproveita o fato de que cada execuções de SQL dinâmico constituem seu próprio lote para substituir
GO
s (iniciar um novo lote) e isolar as interações peculiares de USE
com o compilador. É muito desajeitado, é claro, por causa da necessidade de "embrulhar duas vezes" as coisas após o USE..GO
comandos. Observe também que, devido a esse envolvimento duplo, todas as strings dentro dele terão que ser aspas quádruplas.