sql >> Database >  >> RDS >> Sqlserver

SQL Server:probleem met databasevoorrang gebruiken

Zoals vermeld in de opmerkingen, kun je GO . niet plaatsen in het midden van een groep SQL-instructies die van elkaar afhankelijk zijn omdat:

  1. GO geeft het einde van een samengestelde batch en het begin van de volgende aan. De meeste instructiecontexten (zoals een IF..ELSE ) kan niet een GO omvatten . En,

  2. GO is niet eens een SQL-statement, het is een Management Studio/SQLCMD-opdracht, dus het wordt nergens anders herkend.

Uw situatie is een veelvoorkomende behoefte, maar er is niet één oplossing. Voor het specifieke geval dat u opsomt, is het gebruik van dynamische SQL waarschijnlijk de beste aanpak:

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'

Dit maakt gebruik van het feit dat Dynamic SQL-exections elk hun eigen batch vormen ter vervanging van GO s effect (een nieuwe batch starten) en om de eigenaardige interacties van USE te isoleren met de compiler. Het is natuurlijk erg kludgy vanwege de noodzaak om dingen "dubbel in te pakken" na de USE..GO commando's.

Houd er ook rekening mee dat vanwege deze dubbele wikkeling alle tekenreeksen erin moeten worden viervoudig aangehaald.



  1. Hoe een MS SQL-database die op een externe machine draait, migreren naar mijn lokale MySQL-database die op linux draait, met behoud van codering

  2. preg_replace() vindt eindscheidingsteken niet?

  3. Grote bug in MySQL 8.x? -- buitenlandse sleutels

  4. Hebben in PostgreSQL meerdere UPDATE's naar verschillende rijen in dezelfde tabel een conflicterende vergrendeling?