Come indicato nei commenti, non puoi inserire GO
nel mezzo di un gruppo di istruzioni SQL che dipendono l'una dall'altra perché:
-
GO
indica la fine di un batch compilato e l'inizio del successivo. La maggior parte dei contesti di istruzioni (come unIF..ELSE
) non può coprire unGO
. E, -
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.