sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server:problema de precedencia de la base de datos USE

Como se indica en los comentarios, no puede poner GO en medio de un grupo de sentencias SQL que dependen unas de otras porque:

  1. GO indica el final de un lote compilado y el comienzo del siguiente. La mayoría de los contextos de declaraciones (como un IF..ELSE ) no puede abarcar un GO . Y,

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