Подтвердить что ты не робот

Что такое синтаксический смысл RAISERROR()

Я только что создал After After Trigger, синтаксис которого приведен ниже:

Create trigger tgrInsteadTrigger on copytableto
Instead of Insert as 
    Declare @store_name varchar(30);
    declare @sales int;
    declare @date datetime;

    select @store_name = i.store_name from inserted i
    select @sales = i.sales from inserted i
    select @date = i.Date from inserted i
begin
    if (@sales > 1000)
        begin
        RAISERROR('Cannot Insert where salary > 1000',16,1); ROLLBACK;
        end
    else
        begin
        insert into copytablefrom(store_name, sales, date) values (@store_name, @sales, @date);
        Print 'Instead After Trigger Executed';
        end
End

В приведенном выше синтаксисе я использовал RAISERROR('Cannot Insert where salary > 1000',16,1)

Но когда я пишу RAISERROR('Cannot Insert where salary > 1000'), он выдает ошибку "Некорректный синтаксис рядом" ) "" в той же строке.

Может кто-нибудь объяснить использование (16,1) здесь.

4b9b3361

Ответ 1

Это уровень серьезности error. Уровни от 11 до 20, которые выдают ошибку в SQL. Чем выше уровень, тем более серьезный уровень и transaction должны быть отменены.

Когда вы это сделаете, вы получите синтаксическую ошибку:

RAISERROR('Cannot Insert where salary > 1000').

Потому что вы не указали правильный parameters (severity level или state).

Если вы хотите выдать предупреждение, а не exception, используйте уровни 0–10.

Из MSDN:

тяжесть

Определяемый пользователем уровень серьезности, связанный с этим сообщением. когда использование msg_id для создания пользовательского сообщения, созданного с использованием sp_addmessage, серьезность, указанная в RAISERROR, переопределяет серьезность, указанная в sp_addmessage. Уровни серьезности от 0 до 18 может быть указан любым пользователем. Уровни серьезности от 19 до 25 могут указываться только членами предопределенной роли сервера sysadmin или пользователи с разрешениями ALTER TRACE. Для уровней серьезности от 19 до 25 требуется опция WITH LOG.

состояние

Целое число от 0 до 255. Отрицательные значения или значения больше чем 255 генерирует ошибку. Если та же самая пользовательская ошибка поднят в нескольких местах, используя уникальный номер состояния для каждого Расположение может помочь найти, какой раздел кода вызывает ошибки. Для подробного описания здесь

Ответ 2

16 - это серьезность, а 1 - состояние, более конкретно следующий пример может дать вам более подробную информацию о синтаксисе и использовании:

BEGIN TRY
    -- RAISERROR with severity 11-19 will cause execution to 
    -- jump to the CATCH block.
    RAISERROR ('Error raised in TRY block.', -- Message text.
               16, -- Severity.
               1 -- State.
               );
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    -- Use RAISERROR inside the CATCH block to return error
    -- information about the original error that caused
    -- execution to jump to the CATCH block.
    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;

Вы можете следить за несколькими примерами из http://msdn.microsoft.com/en-us/library/ms178592.aspx

Ответ 3

в соответствии с MSDN

RAISERROR ( { msg_id | msg_str | @local_variable }
    { ,severity ,state }
    [ ,argument [ ,...n ] ] )
    [ WITH option [ ,...n ] ]

16 будет серьезностью.
1 будет состоянием.

Ошибка, возникающая из-за того, что вы неправильно предоставили требуемые параметры для функции RAISEERROR.

Ответ 4

Уровень серьезности 16 в вашем примере кода обычно используется для пользовательских (обнаруженных пользователем) ошибок. Сама СУБД SQL Server испускает уровни серьезности (и сообщения об ошибках) для обнаруженных проблем, как более серьезных (более высокие цифры), так и менее (более низкие цифры).

Состояние должно быть целым числом от 0 до 255 (отрицательные значения приведут к ошибке), но выбор в основном за программистом. Полезно вводить разные значения состояния, если одно и то же сообщение об ошибке для пользовательской ошибки будет возбуждено в разных местах, например если отладка/устранение неполадок будет сопровождаться дополнительным указанием места возникновения ошибки.