SQL Server - остановить или прервать выполнение сценария SQL - PullRequest
296 голосов
/ 18 марта 2009

Есть ли способ немедленно остановить выполнение SQL-скрипта на SQL-сервере, например, команду "break" или "exit"?

У меня есть скрипт, который выполняет некоторую проверку и поиск до того, как он начнет делать вставки, и я хочу, чтобы он прекратился, если какая-либо из проверок или поисков завершится неудачей.

Ответы [ 19 ]

6 голосов
/ 18 марта 2009

Я бы посоветовал вам обернуть соответствующий блок кода в блок try catch. Затем вы можете использовать событие Raiserror со степенью серьезности 11, чтобы прорваться к блоку catch, если хотите. Если вы просто хотите вызвать ошибки, но продолжить выполнение в блоке try, используйте меньшую серьезность.

Имеет смысл?

Ура, John

[Отредактировано для включения справки BOL]

http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx

4 голосов
/ 19 марта 2009

Ни одна из этих работ с заявлениями 'GO'. В этом коде, независимо от того, является ли серьезность 10 или 11, вы получите окончательный оператор PRINT.

Тестовый сценарий:

-- =================================
PRINT 'Start Test 1 - RAISERROR'

IF 1 = 1 BEGIN
    RAISERROR('Error 1, level 11', 11, 1)
    RETURN
END

IF 1 = 1 BEGIN
    RAISERROR('Error 2, level 11', 11, 1)
    RETURN
END
GO

PRINT 'Test 1 - After GO'
GO

-- =================================
PRINT 'Start Test 2 - Try/Catch'

BEGIN TRY
    SELECT (1 / 0) AS CauseError
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage
    RAISERROR('Error in TRY, level 11', 11, 1)
    RETURN
END CATCH
GO

PRINT 'Test 2 - After GO'
GO

Результаты:

Start Test 1 - RAISERROR
Msg 50000, Level 11, State 1, Line 5
Error 1, level 11
Test 1 - After GO
Start Test 2 - Try/Catch
 CauseError
-----------

ErrorMessage
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Divide by zero error encountered.

Msg 50000, Level 11, State 1, Line 10
Error in TRY, level 11
Test 2 - After GO

Единственный способ сделать эту работу - написать скрипт без операторов GO. Иногда это легко. Иногда это довольно сложно. (Используйте что-то вроде IF @error <> 0 BEGIN ....)

4 голосов
/ 18 марта 2009

вы можете использовать RAISERROR .

3 голосов
/ 07 сентября 2015

Вы можете использовать оператор GOTO. Попробуй это. Это полное использование для вас.

WHILE(@N <= @Count)
BEGIN
    GOTO FinalStateMent;
END

FinalStatement:
     Select @CoumnName from TableName
3 голосов
/ 27 июня 2012

Это было мое решение:

...

BEGIN
    raiserror('Invalid database', 15, 10)
    rollback transaction
    return
END
2 голосов
/ 18 марта 2009

Я использую RETURN здесь все время, работает в сценарии или Stored Procedure

Убедитесь, что вы ROLLBACK сделка, если вы в ней, иначе RETURN немедленно приведет к открытой незафиксированной транзакции

1 голос
/ 31 марта 2009

Спасибо за ответ!

raiserror() работает нормально, но вы не должны забывать оператор return, иначе скрипт продолжит работу без ошибок! (hense raiserror не является «throwerror» ;-)) и, конечно, делает откат при необходимости!

raiserror() приятно сообщить человеку, исполняющему сценарий, что что-то пошло не так.

1 голос
/ 05 июля 2012

Если вы просто выполняете сценарий в Management Studio и хотите остановить выполнение или транзакцию отката (если она используется) при первой ошибке, то лучший способ, который я считаю, - использовать блок try catch (начиная с SQL 2005). Это хорошо работает в Management studio, если вы выполняете файл сценария. Хранимая процедура всегда может использовать это.

0 голосов
/ 04 января 2019

Раньше мы использовали следующее ... работали лучше всего:

RAISERROR ('Error! Connection dead', 20, 127) WITH LOG
...