Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server:Problem mit der USE-Datenbankpriorität

Wie in den Kommentaren erwähnt, können Sie GO nicht eingeben inmitten einer Gruppe von SQL-Anweisungen, die voneinander abhängig sind, weil:

  1. GO zeigt das Ende eines kompilierten Stapels und den Beginn des nächsten an. Die meisten Anweisungskontexte (wie ein IF..ELSE ) kann kein GO umfassen . Und,

  2. GO ist nicht einmal eine SQL-Anweisung, sondern ein Management Studio/SQLCMD-Befehl, sodass er nirgendwo anders erkannt wird.

Ihre Situation ist ein allgemeines Bedürfnis, aber es gibt keine einzige Lösung. Für den speziellen Fall, den Sie auflisten, ist die Verwendung von Dynamic SQL wahrscheinlich der beste Ansatz:

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'

Dies macht sich die Tatsache zunutze, dass dynamische SQL-Ausführungen jeweils einen eigenen Batch darstellen, um beide GO zu ersetzen s-Effekt (Starten eines neuen Stapels) und um die eigentümlichen Interaktionen von USE zu isolieren mit dem Compiler. Es ist natürlich sehr klobig, weil Dinge nach dem USE..GO "doppelt gewickelt" werden müssen Befehle.

Beachten Sie auch, dass aufgrund dieses doppelten Umbruchs alle darin enthaltenen Zeichenfolgen in vier Anführungszeichen gesetzt werden müssen.