Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server:problem z pierwszeństwem korzystania z bazy danych

Jak zauważono w komentarzach, nie możesz umieścić GO w środku grupy instrukcji SQL, które są od siebie zależne, ponieważ:

  1. GO wskazuje koniec jednej skompilowanej partii i początek następnej. Większość kontekstów instrukcji (takich jak IF..ELSE ) nie może obejmować GO . I,

  2. GO nie jest nawet instrukcją SQL, jest to polecenie Management Studio/SQLCMD, więc nie zostanie rozpoznane nigdzie indziej.

Twoja sytuacja jest powszechną potrzebą, ale nie ma jednego rozwiązania. W konkretnym przypadku, który podajesz, prawdopodobnie najlepszym rozwiązaniem jest użycie dynamicznego 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'

Wykorzystuje to fakt, że każde z dynamicznych wykonań SQL stanowi osobną partię, aby zastąpić GO s (rozpoczęcie nowej partii) i wyizolowanie osobliwych interakcji USE z kompilatorem. Jest to oczywiście bardzo niezgrabne ze względu na konieczność „podwójnego zawinięcia” rzeczy po USE..GO poleceń.

Zwróć też uwagę, że z powodu tego podwójnego zawinięcia wszelkie ciągi znaków w środku będą musiały być ujęte w czterocyfrowy cudzysłów.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server zwraca ??? gdy kolumna jest aktualizowana znakami tajlandzkimi

  2. SQL Server wyczyścił moją tabelę po (niepoprawnie) utworzeniu nowej kolumny .. co się do cholery stało?

  3. Nie można załadować pliku lub zestawu „crystal Decisions.windows.forms,version=13.0.2000.0”

  4. Nie można dołączyć przykładowej bazy danych w SQL Server 2012

  5. Jak zmienić znaki podziału wyrazów w indeksowaniu pełnotekstowym programu SQL Server