Câu trả lời:
Như đã nói, không có cách nào.
Tuy nhiên, một điều chúng tôi làm là bao gồm kiểm tra nhanh trong tiêu đề tập lệnh của chúng tôi, để xác định xem chế độ SQLCMD có được bật hay không (và chấm dứt tập lệnh nếu không):
:setvar DatabaseName "MyDatabase"
GO
IF ('$(DatabaseName)' = '$' + '(DatabaseName)')
RAISERROR ('This script must be run in SQLCMD mode. Disconnecting.', 20, 1) WITH LOG
GO
-- The below is only run if SQLCMD is on, or the user lacks permission to raise fatal errors
IF @@ERROR != 0
SET NOEXEC ON
GO
PRINT 'You will not see this unless SQLCMD mode is on'
-- Rest of script goes here
GO
SET NOEXEC OFF
GO
Có một lý do Severity 20 được sử dụng, nó có xu hướng GO
hủy kết nối ngay lập tức, ngăn không cho bất kỳ mã script nào chạy nữa, ngay cả khi có các terminator sau này trong script.
Chỉ ra các sự cố hệ thống và là các lỗi nghiêm trọng, có nghĩa là tác vụ Cơ sở dữ liệu đang thực thi một câu lệnh hoặc lô không còn chạy nữa. Nhiệm vụ ghi lại thông tin về những gì đã xảy ra và sau đó chấm dứt. Trong hầu hết các trường hợp, kết nối ứng dụng với thể hiện của Cơ sở dữ liệu cũng có thể chấm dứt . Nếu điều này xảy ra, tùy thuộc vào sự cố, ứng dụng có thể không thể kết nối lại.
Thông báo lỗi trong phạm vi này có thể ảnh hưởng đến tất cả các quy trình truy cập dữ liệu trong cùng một cơ sở dữ liệu và có thể chỉ ra rằng cơ sở dữ liệu hoặc đối tượng bị hỏng. Thông báo lỗi với mức độ nghiêm trọng từ 19 đến 24 được ghi vào nhật ký lỗi.
SET NOEXEC ON
làm một biện pháp an toàn bổ sung để ngăn chặn mọi thứ khác trong tập lệnh chạy.
Không.
Nhưng bạn luôn có thể chạy trong chế độ SQLCMD và có T-SQL trong đó
Để phân biệt rõ ràng giữa các lệnh SQLCMD và Transact-SQL, tất cả các lệnh SQLCMD, cần phải được bắt đầu bằng dấu hai chấm (:).