Чи можна ввімкнути режим 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

Існує причина, по якій використовується серйозність 20, вона, як правило, негайно GOприпиняє з'єднання, не дозволяючи виконувати більше коду сценарію, навіть якщо пізніше в сценарії є термінали пакетної роботи.

Тяжкість 20-24 :

Вкажіть системні проблеми та є фатальними помилками, а це означає, що завдання Data Engine Engine, яке виконує оператор або пакет, більше не виконується. Завдання записує інформацію про те, що сталося, а потім припиняється. У більшості випадків підключення програми до екземпляра бази даних може також припинятися . Якщо це станеться, залежно від проблеми, додаток може не вдатися знову підключитися.

Повідомлення про помилки в цьому діапазоні можуть впливати на всі процеси доступу до даних в одній базі даних і можуть вказувати на пошкодження бази даних або об'єкта. Повідомлення про помилки із ступенем вираженості від 19 до 24 записуються до журналу помилок.


Для ssms вистачить перших 2 рядків, і для sql 2000 Query Analyzer він працює, але повідомлення не відображається.
bernd_k

Але хіба сценарій просто не буде виконуватись із наступного GO?
Дан Нолан

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

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

Гм, це використовує режим SQLCMD, щоб дізнатися, чи увімкнено режим SQLCMD ... Я б сказав, що він не працюватиме належним чином, коли режим SQLCMD вимкнено, як це зазначив @bernd_k. Однак, якщо: setvar видалено / замінено на SQL, воно працюватиме.
Дуб_3260548

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.