Melhorias do T-SQL no SQL Server 2012 (Parte 3)

Posted on abril 9, 2012

2


 

Introdução

 

Quando desejamos realizar o tratamento de exceções dentro do SQL Server, utilizamos o recurso TRY..CATCH que é semelhante ao que temos nas linguagens C#, C++, sendo assim conseguimos capturar o erro para que o mesmo seja tratado.

 

Em Versões Anteriores

Porém nas versões anteriores do SQL Server, encontrávamos problemas de como capturar esse erro em forma de exceção.

 

USE tempdb

go

 

CREATE TABLE DadosRethrowError

(

     ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,

     Nome VARCHAR(100) NOT NULL,

     DataNascimento DATETIME2 NOT NULL,

     Sexo CHAR(1),

     DataRegistro DATETIME2 DEFAULT GETDATE()

)

Inserindo um registro corretamente

 

BEGIN TRY

BEGIN TRANSACTION

    

     INSERT INTO dbo.DadosRethrowError (Nome, DataNascimento, Sexo)

     VALUES (‘Luan Moreno Medeiros Maciel’,‘1988-07-20’,‘M’)

 

                                                   

     IF (@@TRANCOUNT >= 1)

          COMMIT TRANSACTION

    

END TRY  

BEGIN CATCH

    

     PRINT ‘Error!’      

     IF (@@TRANCOUNT = 0)

          ROLLBACK TRANSACTION          

    

END CATCH

 

(1 row(s) affected)

 

Agora se tentarmos inserir um registro incorreto, temos o seguinte retorno.

BEGIN TRY

BEGIN TRANSACTION

    

     INSERT INTO dbo.DadosRethrowError (ID, Nome, DataNascimento, Sexo)

     VALUES (2,‘Daniela Abreu da Silva’,‘1985-02-10’,‘F’)

                                                   

     IF (@@TRANCOUNT >= 1)

          COMMIT TRANSACTION

    

END TRY  

BEGIN CATCH

    

     PRINT ‘Error!’      

     IF (@@TRANCOUNT = 0)

          ROLLBACK TRANSACTION          

    

END CATCH

(0 row(s) affected)
Error!

 

Ou seja nesse momento temos um erro gerado, porém não foi gerado nenhuma exceção, e para que seja possível capturar este erro, podemos utilizar o seguinte comando

BEGIN TRY

BEGIN TRANSACTION

    

     INSERT INTO dbo.DadosRethrowError (ID, Nome, DataNascimento, Sexo)

     VALUES (2,‘Daniela Abreu da Silva’,‘1985-02-10’,‘F’)

                                                   

     IF (@@TRANCOUNT >= 1)

          COMMIT TRANSACTION

    

END TRY  

BEGIN CATCH

               

     IF (@@TRANCOUNT = 0)

          ROLLBACK TRANSACTION

                    

     SELECT  ERROR_NUMBER() AS ErrorNumber

             ,ERROR_SEVERITY() AS ErrorSeverity

             ,ERROR_STATE() AS ErrorState

             ,ERROR_PROCEDURE() AS ErrorProcedure

             ,ERROR_LINE() AS ErrorLine

             ,ERROR_MESSAGE() AS ErrorMessage;

END CATCH

 

Aqui, conseguimos capturar o erro em forma de informação, mais não em forma de uma exceção do SQL Server.

 

image

(Figura 1 – Mensagem gerada pelo SQL Server.)

 

No SQL Server 2012

 

Para que esse problema fosse resolvido, na nova versão do SQL Server, temos o comando THROW, ele fará com que o erro gerado se torne uma exceção, sendo assim temos:

 

BEGIN TRY

BEGIN TRANSACTION

    

     INSERT INTO dbo.DadosRethrowError (ID, Nome, DataNascimento, Sexo)

     VALUES (2,‘Daniela Abreu da Silva’,‘1985-02-10’,‘F’)

                                                   

     IF (@@TRANCOUNT >= 1)

          COMMIT TRANSACTION

    

END TRY  

BEGIN CATCH

    

     THROW;

               

     IF (@@TRANCOUNT = 0)

          ROLLBACK TRANSACTION

         

END CATCH

 

(0 row(s) affected)

 

Msg 544, Level 16, State 1, Line 5 Cannot insert explicit value for identity column in table ‘DadosRethrowError’ when IDENTITY_INSERT is set to OFF.

 

Assim vemos claramente que uma exceção foi gerada, facilitando assim o tratamento da mesma.