Могу ли я включить режим SQLCMD из скрипта?


17

Есть ли что-то вроде директивы, которую я могу использовать в скрипте, чтобы заставить SSMS включить / отключить режим SQLCMD?

Ответы:


17

Как уже было сказано, пути нет.

Однако, одну вещь, которую мы делаем, это включаем быструю проверку в заголовок нашего скрипта, чтобы определить, включен ли режим SQLCMD (и завершить скрипт, если нет):

: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

Существует причина, по которой используется Severity 20, он стремится немедленно GOразорвать соединение, предотвращая запуск любого кода скрипта, даже если в скрипте есть более поздние терминаторы пакетов.

Серьезность 20-24 :

Обозначают системные проблемы и являются фатальными ошибками. Это означает, что задача компонента Database Engine, выполняющая инструкцию или пакет, больше не выполняется. Задача записывает информацию о том, что произошло, а затем завершается. В большинстве случаев подключение приложения к экземпляру компонента Database Engine также может прерваться . Если это произойдет, в зависимости от проблемы приложение может не подключиться.

Сообщения об ошибках в этом диапазоне могут влиять на все процессы, обращающиеся к данным в одной и той же базе данных, и могут указывать, что база данных или объект повреждены. Сообщения об ошибках с уровнем серьезности от 19 до 24 записываются в журнал ошибок.


Для ssms первых двух строк будет достаточно, а для sql 2000 Query Analyzer это работает, но сообщение не отображается.
bernd_k

Но разве сценарий не будет продолжать выполняться со следующего GO?
Дэн Нолан

Я использую SSMS 2008 R2, и там появляются две строки: Meldung 102, Ebene 15, Status 1, Zeile 1 Неверный синтаксис рядом с ':'. При использовании SQL Server 2000 Query Analyzer вам необходимо использовать RAISERROR.
bernd_k

4
Как упомянуто здесь , вы также можете установить SET NOEXEC ONв качестве дополнительной меры безопасности, чтобы предотвратить запуск чего-либо еще в скрипте.
Yahoo серьезно

Хм, это использует режим SQLCMD, чтобы выяснить, включен ли режим SQLCMD ... Я бы сказал, что он не будет работать должным образом, когда режим SQLCMD выключен, как в @bernd_k. Однако, если: setvar удален / заменен для SQL, он будет работать.
Oak_3260548

7

Нет.

Но вы всегда можете работать в режиме SQLCMD и иметь в нем T-SQL

Чтобы провести четкое различие между командами SQLCMD и Transact-SQL, все команды SQLCMD должны иметь префикс двоеточия (:).


Это все еще верно для SQL Server 2012/2014/2016?
Джон aka hot2use

1
@ hot2use: Да, я использовал его в 2014/2016
gbn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.