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ì:
-
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ộtGO
. Và, -
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.