sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server:ANVÄND databasprioritetsproblem

Som noterat i kommentarerna kan du inte lägga till GO mitt i en grupp av SQL-satser som är beroende av varandra eftersom:

  1. GO indikerar slutet på en kompilerad batch och början på nästa. De flesta satskontexter (som en IF..ELSE ) kan inte sträcka sig över en GO . Och,

  2. GO är inte ens en SQL-sats, det är ett Management Studio/SQLCMD-kommando, så det kommer inte att kännas igen någon annanstans.

Din situation är ett vanligt behov, men det finns ingen enskild lösning. För det specifika fallet som du listar är det förmodligen det bästa sättet att använda Dynamic SQL:

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'

Detta utnyttjar det faktum att dynamiska SQL-utsnitt var och en utgör sin egen batch för att båda ersätta GO s effekt (starta en ny batch) och för att isolera de märkliga interaktionerna av USE med kompilatorn. Det är såklart väldigt klumpigt på grund av behovet av att "dubbellinda" saker efter USE..GO kommandon.

Observera också att på grund av denna dubbelomslagning måste alla strängar inuti den vara fyrdubbla citattecken.



  1. Hur man använder orderby på element som sammanfogats med Laravel Eloquent-metoden WITH

  2. Hur lång tid tar det att bli någorlunda skicklig i Oracle givet SQL Server

  3. SQL-fråga:Hur kan jag få data från rad med nummer 1000 direkt?

  4. hur gjuter man hexadecimalen till varchar(datetime)?