Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server :problema relativo alla precedenza del database USE

Come indicato nei commenti, non puoi inserire GO nel mezzo di un gruppo di istruzioni SQL che dipendono l'una dall'altra perché:

  1. GO indica la fine di un batch compilato e l'inizio del successivo. La maggior parte dei contesti di istruzioni (come un IF..ELSE ) non può coprire un GO . E,

  2. GO non è nemmeno un'istruzione SQL, è un comando Management Studio/SQLCMD, quindi non verrà riconosciuto da nessun'altra parte.

La tua situazione è un'esigenza comune, ma non esiste un'unica soluzione. Per il caso specifico che elenchi, l'utilizzo di Dynamic SQL è probabilmente l'approccio migliore:

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'

Ciò sfrutta il fatto che le esecuzioni Dynamic SQL costituiscono ciascuna il proprio batch in sostituzione di GO s effetto (avvio di un nuovo batch) e per isolare le interazioni peculiari di USE con il compilatore. Ovviamente è molto goffo a causa della necessità di "avvolgere" le cose dopo USE..GO comandi.

Nota anche che a causa di questo doppio avvolgimento tutte le stringhe al suo interno dovranno essere quadruple.