Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server :problème de priorité de la base de données USE

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 :

  1. GO indique la fin d'un lot compilé et le début du suivant. La plupart des contextes d'instruction (comme un IF..ELSE ) ne peut pas couvrir un GO . Et,

  2. 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.