Bisakah saya mengaktifkan mode SQLCMD dari dalam skrip?

17

Apakah ada sesuatu seperti arahan yang dapat saya gunakan dalam skrip untuk memaksa SSMS untuk mengaktifkan / menonaktifkan mode SQLCMD?

bernd_k
sumber

Jawaban:

17

Seperti yang telah dikatakan, tidak ada jalan.

Namun, satu hal yang kami lakukan adalah memasukkan pemeriksaan cepat di header skrip kami, untuk menentukan apakah mode SQLCMD aktif (dan menghentikan skrip jika tidak):

: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

Ada alasan Severity 20 digunakan, itu cenderung mematikan koneksi segera, mencegah kode skrip lagi dari berjalan, bahkan jika ada GObatch terminator nanti dalam skrip.

Tingkat keparahan 20-24 :

Tunjukkan masalah sistem dan merupakan kesalahan fatal, yang berarti bahwa tugas Mesin Basis Data yang menjalankan pernyataan atau kumpulan tidak lagi berjalan. Tugas mencatat informasi tentang apa yang terjadi dan kemudian berakhir. Dalam kebanyakan kasus, koneksi aplikasi ke mesin Database juga dapat berakhir . Jika ini terjadi, tergantung pada masalahnya, aplikasi mungkin tidak dapat terhubung kembali.

Pesan kesalahan dalam rentang ini dapat mempengaruhi semua proses mengakses data dalam database yang sama dan dapat menunjukkan bahwa database atau objek rusak. Pesan kesalahan dengan tingkat keparahan dari 19 hingga 24 ditulis ke log kesalahan.

Dan Nolan
sumber
Untuk ssms 2 baris pertama akan cukup dan untuk sql 2000 Query Analyzer berfungsi, tetapi pesan tidak ditampilkan.
bernd_k
Tapi bukankah skrip akan terus dijalankan dari GO berikutnya?
Dan Nolan
Saya menggunakan SSMS 2008 R2 dan di sana 2 baris menghasilkan: Meldung 102, Ebene 15, Status 1, Zeile 1 Sintaks salah dekat ':'. Menggunakan SQL Server 2000 Query Analyzer Anda perlu menggunakan RAISERROR.
bernd_k
4
Seperti yang disebutkan di sini , Anda juga dapat menetapkan SET NOEXEC ONsebagai langkah keamanan tambahan untuk mencegah hal lain dalam skrip berjalan.
Yahoo Serious
Hmm, ini menggunakan mode SQLCMD untuk mencari tahu apakah mode SQLCMD aktif ... Saya akan mengatakan itu tidak akan berfungsi dengan baik ketika mode SQLCMD mati, seperti yang dialami @bernd_k. Namun, jika: setvar dihapus / diganti untuk SQL, maka akan berfungsi.
Oak_3260548
7

Tidak.

Tetapi Anda selalu dapat menjalankan dalam mode SQLCMD dan memiliki T-SQL di dalamnya

Untuk membuat perbedaan yang jelas antara perintah SQLCMD dan Transact-SQL, semua perintah SQLCMD, harus diawali dengan tanda titik dua (:).

gbn
sumber
Apakah ini masih berlaku untuk SQL Server 2012/2014/2016?
John aka hot2use
1
@ hot2use: Ya, saya sudah menggunakannya pada 2014/2016
gbn