Comme indiqué dans les commentaires, vous ne pouvez pas mettre GO
au milieu d'un groupe d'instructions SQL qui dépendent les unes des autres car :
-
GO
indique la fin d'un lot compilé et le début du suivant. La plupart des contextes d'instruction (comme unIF..ELSE
) ne peut pas couvrir unGO
. Et, -
GO
n'est même pas une instruction SQL, c'est une commande Management Studio/SQLCMD, elle ne sera donc reconnue nulle part ailleurs.
Votre situation est un besoin commun, mais il n'y a pas de solution unique. Pour le cas spécifique que vous énumérez, l'utilisation de Dynamic SQL est probablement la meilleure approche :
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'
Cela tire parti du fait que les exécutions Dynamic SQL constituent chacune leur propre lot pour se substituer à la fois à GO
s (démarrage d'un nouveau lot) et pour isoler les interactions particulières de USE
avec le compilateur. C'est très kludgy bien sûr à cause de la nécessité de "doubler" les choses après le USE..GO
commandes.
Notez également qu'à cause de ce double encapsulage, toutes les chaînes à l'intérieur devront être entre guillemets quadruples.