Логика прерывания процедуры создания SQL - PullRequest
0 голосов
/ 27 марта 2012

Добрый день всем -

У меня есть временная хранимая процедура, которую нужно запускать как исправление в нескольких местах, и я хотел бы прервать создание и компиляцию SP, если версия приложения не соответствует той, которую я ввожу. У меня есть основная идея, но я хотел бы, чтобы сообщения появлялись без проблем со схемой при попытке скомпилировать SP.

Вот в основном то, что у меня есть:

IF EXISTS ... DROP PROCEDURE 

SELECT TOP 1 Version INTO #CurrentVersion FROM Application_Version ORDER BY UpdateDate DESC

IF NOT EXISTS (SELECT 1 FROM #CurrentVersion WHERE Version = 10)
RAISERROR ('This is for U10 only. Check the application version.', 20, 1) WITH LOG

CREATE PROCEDURE ....

RAISERROR приводит к тому, что SP не попадает в БД, и я получаю ошибку, но я также получаю ошибки схемы из-за изменений схемы в прошлом. Поскольку SP должен быть первым оператором в пакете, я не могу использовать IF / ELSE, а NOEXEC дает те же результаты, что и RAISERROR (без ошибки).

Есть идеи, что можно сделать, чтобы получить все те же результаты, что и выше, без SP, проверяющего схему, если она попадает в RAISERROR, так что я не получаю кучу дополнительных сообщений, о которых сообщалось?

Ответы [ 3 ]

1 голос
/ 27 марта 2012

Требуется условие ошибки для остановки выполнения сценария, что возможно в режиме SQLCMD редактора запросов с простым :on error exit:

:on error exit

SELECT TOP 1 Version INTO #CurrentVersion FROM Application_Version ORDER BY UpdateDate DESC

IF NOT EXISTS (SELECT 1 FROM #CurrentVersion WHERE Version = 10)
   RAISERROR ('This is for U10 only. Check the application version.', 16, 1);
go

IF EXISTS ... DROP PROCEDURE 
go

CREATE PROCEDURE ....
...
go

С этим на месте нет необходимости повышать уровень серьезности 20. Достаточно серьезность 16, которая решит проблему ERRORLOG, на которую вы жалуетесь.

0 голосов
/ 27 марта 2012

Здесь есть несколько вариантов.Мой подход был бы следующим, потому что я чувствую, что он обеспечивает лучший поток:

IF EXISTS ... DROP PROCEDURE 

IF EXISTS (SELECT * FROM Application_Version WHERE Version = 10)
BEGIN
    DECLARE @sql NVARCHAR(MAX)
    SET @sql = 'CREATE PROCEDURE blablabla AS
        BEGIN
            -- Your Procedure HERE
        END'
    EXEC sp_executesql @sql
END ELSE
    RAISERROR ('This is for U10 only. Check the application version.', 20, 1) WITH LOG
0 голосов
/ 27 марта 2012

Оператор RETURN выйдет из SP. При проверке ошибок ставьте BEGIN и END после оператора IF, а после RAISERROR - оператора RETURN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...