Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server:USE problema de precedência do banco de dados


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:

  1. GO indica o fim de um lote compilado e o início do próximo. A maioria dos contextos de instrução (como um IF..ELSE ) não pode abranger um GO . E,

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