sql >> Databáze >  >> RDS >> Sqlserver

SQL Server:Problém s prioritou databáze USE

Jak je uvedeno v komentářích, nemůžete zadat GO uprostřed skupiny příkazů SQL, které jsou na sobě závislé, protože:

  1. GO označuje konec jedné zkompilované dávky a začátek další. Většina kontextů příkazů (jako IF..ELSE ) nemůže zahrnovat GO . A,

  2. GO není ani příkaz SQL, je to příkaz Management Studio/SQLCMD, takže nebude nikde jinde rozpoznán.

Vaše situace je běžná potřeba, ale neexistuje jediné řešení. Pro konkrétní případ, který uvádíte, je použití dynamického SQL pravděpodobně nejlepším přístupem:

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'

To využívá skutečnost, že každá dynamická SQL exekce tvoří svou vlastní dávku a obě nahrazují GO s efektem (spuštění nové dávky) a k izolaci zvláštních interakcí USE s kompilátorem. Je to samozřejmě velmi nemotorné, protože je potřeba věci po USE..GO "dvojitě zabalit" příkazy.

Všimněte si také, že kvůli tomuto dvojitému obalení jakékoli řetězce uvnitř budou muset být uvedeny čtyřnásobně.



  1. MySQL regexp mnohem pomalejší než jako

  2. výchozí časové pásmo postgres

  3. Jak zrušit tabulku na základě podmínky IF v postgresu?

  4. RPostgreSQL - R připojení k Amazon Redshift - Jak psát/uveřejňovat větší datové sady