Como se indica en los comentarios, no puede poner GO
en medio de un grupo de sentencias SQL que dependen unas de otras porque:
-
GO
indica el final de un lote compilado y el comienzo del siguiente. La mayoría de los contextos de declaraciones (como unIF..ELSE
) no puede abarcar unGO
. Y, -
GO
ni siquiera es una declaración SQL, es un comando de Management Studio/SQLCMD, por lo que no se reconocerá en ningún otro lugar.
Tu situación es una necesidad común, pero no hay una única solución. Para el caso específico que enumera, usar Dynamic SQL es probablemente el mejor enfoque:
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'
Esto aprovecha el hecho de que las ejecuciones SQL dinámicas constituyen cada una su propio lote para sustituir a GO
s (comenzar un nuevo lote) y para aislar las interacciones peculiares de USE
con el compilador. Es muy confuso, por supuesto, debido a la necesidad de "envolver dos veces" las cosas después de USE..GO
comandos.
Tenga en cuenta también que debido a este doble envoltorio, cualquier cadena dentro tendrá que estar entre comillas cuádruples.