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.
4 answers
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.
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
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
.
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.