quinta-feira, 30 de julho de 2009

Try Catch no Sql Server (somente a partir do 2005)

Uma implementação adicionada a partir do Sql Server 2005, são os blocos TRY..CATCH, que adicionam um pouco mais de consistência ao T-SQL como linguagem.

Porém antes de utilizar esta funcionalidade em nosso dia a dia, alguns pontos devem ser considerados. O TRY..CATCH só intercepta os seguintes tipos de erros:

  • Avisos ou mensagens informativas que têm uma severidade 10 ou menor.
  • Erros que têm uma severidade 20 ou maior (verifique a tabela sys.sysmessages), que param o processamento de tarefa do Mecanismo de Banco de Dados do SQL Server para a sessão. Se ocorrer um erro com severidade 20 ou maior e a conexão com o banco de dados não for interrompida, TRY…CATCH tratará o erro.
  • Atenções, como solicitações da interrupção de cliente ou conexões de cliente desfeitas.
  • Quando a sessão for finalizada por um administrador de sistema com o uso da instrução KILL.
A sintaxe do bloco é a seguinte:

BEGIN TRY
{ sql_statement | statement_block }
END TRY
BEGIN CATCH
[ { sql_statement | statement_block } ]
END CATCH
[ ; ]

Vejamos um exemplo desta implementação com o banco de dados Northwind, utilizando a tabela Employees. Para este exemplo, vamos simular um erro de inserção, tentando inserir uma chave já existente na tabela.

Como o campo EmployeeId além de chave primária, é identity, portanto devemos setar o IDENTITY_INSERT para ON para simular o erro.

BEGIN TRY

SET IDENTITY_INSERT [Northwind].[dbo].[Employees] ON

INSERT INTO [Northwind].[dbo].[Employees]
(employeeid
,[LastName]
,[FirstName]
,[Title]
,[TitleOfCourtesy]
,[BirthDate]
,[HireDate]
,[Address]
,[City]
,[Region]
,[PostalCode]
,[Country]
,[HomePhone]
,[Extension])
VALUES
(1,'Ribeiro'
,'Rodrigo'
,'Sir'
,'Digaum'
,getdate()
,getdate()
,''
,''
,''
,''
,''
,''
,'')

set identity_insert [Northwind].[dbo].[Employees] off

END TRY
BEGIN CATCH

set identity_insert [Northwind].[dbo].[Employees] off
-- Print error information.
PRINT 'Mensagem: ' + CONVERT(varchar(50), ERROR_NUMBER()) +
', Sveridade ' + CONVERT(varchar(5), ERROR_SEVERITY()) +
', Procedure ' + ISNULL(ERROR_PROCEDURE(), '-') +
', Linha ' + CONVERT(varchar(5), ERROR_LINE());
PRINT ERROR_MESSAGE();

END CATCH


Até a próxima!

Nenhum comentário:

Postar um comentário

Leave your comment here!