Tôi có thể bật chế độ SQLCMD từ bên trong tập lệnh không?


17

Có thứ gì đó giống như một lệnh mà tôi có thể sử dụng trong tập lệnh để buộc SSMS bật / tắt chế độ SQLCMD không?

Câu trả lời:


17

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 GOhủ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.

Mức độ nghiêm trọng 20-24 :

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.


Đối với ssms, 2 dòng đầu tiên là đủ và đối với Bộ phân tích truy vấn sql 2000 thì nó hoạt động, nhưng thông báo không được hiển thị.
bernd_k

Nhưng liệu kịch bản có tiếp tục thực hiện từ GO tiếp theo không?
Dan Nolan

Tôi đang sử dụng SSMS 2008 R2 và có 2 dòng sản xuất: Meldung 102, Ebene 15, Status 1, Zeile 1 Cú pháp không chính xác gần ':'. Sử dụng Trình phân tích truy vấn SQL Server 2000, bạn cần sử dụng RAISERROR.
bernd_k

4
Như đã đề cập ở đây , bạn cũng có thể đặt SET NOEXEC ONlà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.
Yahoo Nghiêm túc

Hmm, đây là sử dụng chế độ SQLCMD để tìm hiểu xem chế độ SQLCMD có bật không ... Tôi muốn nói rằng nó sẽ không hoạt động đúng khi chế độ SQLCMD tắt, như @bernd_k đã trải nghiệm. Tuy nhiên, nếu: setvar bị xóa / thay thế cho SQL, thì nó sẽ hoạt động.
Oak_3260548

7

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 (:).


Điều này có còn hợp lệ cho SQL Server 2012/2014/2016 không?
John aka hot2use

1
@ hot2use: Có, tôi đã sử dụng nó vào 2014/2016
gbn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.