Qual é o Significado de sintaxe de RAISERROR()

acabei de criar um após Trigger cuja sintaxe é dada abaixo:

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

na sintaxe acima que useiRAISERROR('Cannot Insert where salary > 1000',16,1)

mas quando escrevo RAISERROR('Cannot Insert where salary > 1000') dá o erro "sintaxe incorreta perto') '" na mesma linha.

alguém pode explicar o uso de (16,1) aqui.

Author: Darren, 2013-04-23

4 answers

É o nível de gravidade do erro. Os níveis são de 11 a 20 que lançam um erro no SQL. Quanto maior o nível, mais grave o nível e a transação deve ser abortada.

Obterá o erro de sintaxe quando o fizer:

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

Porque não especificou os parâmetros correctos (nível de gravidade ou estado).

Se desejar emitir um aviso e não uma excepção, utilize os níveis 0 - 10.

De MSDN:

Gravidade

É o nível de gravidade definido pelo utilizador associado a esta mensagem. Quando usar o msg_id para criar uma mensagem definida pelo utilizador criada com sp_addmessage, a gravidade indicada no RAISERROR sobrepõe-se à gravidade especificada na página sp_ addmessage. Níveis de gravidade de 0 a 18 pode ser especificado por qualquer usuário. Os níveis de severidade de 19 a 25 podem só ser indicado pelos membros da função do servidor fixo do sysadmin ou utilizadores com permissões de alteração de vestígios. Para níveis de gravidade a partir de 19 ao longo de 25 anos, a Com a opção LOG é necessária.

Estado

É um inteiro de 0 a 255. Valores ou valores negativos maior que 255 gera um erro. Se o mesmo erro definido pelo Utilizador for criado em vários locais, usando um número de Estado único para cada a localização pode ajudar a encontrar qual seção do código está levantando os erros.

Http://support.microsoft.com/kb/321903

 49
Author: Darren, 2013-04-23 13:10:09

16 é a gravidade e 1 é o estado, mais especificamente o seguinte exemplo pode dar-lhe mais detalhes sobre sintaxe e uso:

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;

Pode seguir e experimentar mais exemplos de http://msdn.microsoft.com/en-us/library/ms178592.aspx

 19
Author: harsh, 2013-04-23 13:07:28

De acordo com MSDN

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

16 seria a severidade.
1 seria o estado.

O erro que você tem é porque você não forneceu corretamente os parâmetros necessários para a função RAISEERROR.

 11
Author: Woot4Moo, 2013-04-23 13:06:19

O nível de gravidade 16 no seu código de exemplo é normalmente utilizado para erros definidos pelo utilizador (detectados pelo utilizador). O servidor SQL DBMS em si emite níveis de gravidade (e mensagens de erro) para problemas que detecta, tanto mais graves (números mais elevados) quanto menos (números mais baixos).

O estado deve ser um inteiro entre 0 e 255( os valores negativos dão um erro), mas a escolha é basicamente do programador. é útil colocar valores de Estado diferentes se a mesma mensagem de erro para erro definido pelo Usuário será levantado em diferentes locais, por exemplo, se a depuração/Solução de problemas será assistida por ter uma indicação extra de onde o erro ocorreu.

 3
Author: hardmath, 2013-04-23 13:15:39