Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server:Проблем с приоритета на базата данни на USE

Както е отбелязано в коментарите, не можете да поставите GO в средата на група от SQL изрази, които са зависими един от друг, защото:

  1. GO показва края на един компилиран пакет и началото на следващия. Повечето контексти на изрази (като IF..ELSE ) не може да обхваща GO . И,

  2. GO дори не е SQL израз, а е команда на Management Studio/SQLCMD, така че няма да бъде разпозната никъде другаде.

Вашата ситуация е обща нужда, но няма едно единствено решение. За конкретния случай, който изброявате, използването на 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'

Това използва факта, че всяко изпълнение на Dynamic SQL представлява своя собствена партида, за да замести GO s ефект (стартиране на нова партида) и за изолиране на особените взаимодействия на USE с компилатора. Много е тъпо, разбира се, поради необходимостта от "двойно опаковане" на нещата след USE..GO команди.

Имайте предвид също, че поради това двойно опаковане всички низове вътре в него ще трябва да бъдат поставени в четворни кавички.



  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 2012, но работи добре в SQL Server 2000

  2. Извличане/избиране на стойности от множество редове в 1 единствен ред в sql сървър

  3. Как да свържа Android приложение към SQL Server чрез jbdc?

  4. Обединете няколко реда в един ред

  5. Ескейпиране на низове, съдържащи единични кавички в PowerShell, готово за SQL заявка