Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server:SỬ DỤNG vấn đề ưu tiên cơ sở dữ liệu

Như đã lưu ý trong các nhận xét, bạn không thể đặt GO ở giữa một nhóm câu lệnh SQL phụ thuộc vào nhau vì:

  1. GO cho biết phần cuối của một lô đã biên dịch và phần bắt đầu của lô tiếp theo. Hầu hết các ngữ cảnh câu lệnh (như IF..ELSE ) không thể kéo dài một GO . Và,

  2. GO thậm chí không phải là một trạng thái SQL, nó là một lệnh Management Studio / SQLCMD, vì vậy nó sẽ không được nhận dạng ở bất kỳ nơi nào khác.

Tình huống của bạn là một nhu cầu phổ biến, nhưng không có một giải pháp duy nhất. Đối với trường hợp cụ thể mà bạn liệt kê, sử dụng Dynamic SQL có lẽ là cách tiếp cận tốt nhất:

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'

Điều này thúc đẩy thực tế là mỗi lần loại bỏ SQL động tạo thành lô riêng của chúng để thay thế cho cả GO hiệu ứng của s (bắt đầu một lô mới) và để cô lập các tương tác đặc biệt của USE với trình biên dịch. Tất nhiên, nó rất khó vì cần phải "bọc kép" mọi thứ sau USE..GO lệnh.

Cũng xin lưu ý rằng vì cách gói kép này, bất kỳ chuỗi nào bên trong nó sẽ phải được trích dẫn bốn lần.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn PIVOT động của SQL Server?

  2. Không thể thấy trình kích hoạt mà tôi đã tạo trong SQL Server Management Studio 2008

  3. TSQL 2005, XML DML - Cập nhật hai giá trị cùng một lúc?

  4. Phân chia số nguyên trong máy chủ sql

  5. SQL Server Internals:Lập kế hoạch Caching Pt. I - Tái sử dụng các kế hoạch