Informando sobre erros

Transações e tratamento de erros no SQL Server

Miriam Antona

Software Engineer

Obtendo um erro — revisão

INSERT INTO products (product_name, stock, price)
    VALUES ('Trek Powerfly 5 - 2018', 10, 3499.99);
Msg 2627, Level 14, State 1, Line 1
Violação da restrição UNIQUE KEY 'unique_name'. 
Não é possível inserir chave duplicada no objeto 'dbo.products'. 
O valor duplicado é (Trek Powerfly 5 - 2018).
Transações e tratamento de erros no SQL Server

Obtendo um erro — revisão

BEGIN TRY
    INSERT INTO products (product_name, stock, price)
        VALUES ('Trek Powerfly 5 - 2018', 10, 3499.99);
    SELECT 'Produto inserido corretamente!' AS message;
END TRY
BEGIN CATCH
    SELECT 'Ocorreu um erro! Você está no bloco CATCH' AS message;  
END CATCH
| message                                       |
|-----------------------------------------------|
| Ocorreu um erro! Você está no bloco CATCH     |
Transações e tratamento de erros no SQL Server

Funções de erro

ERROR_NUMBER() retorna o número do erro.

ERROR_SEVERITY() retorna a gravidade do erro (11–19).

ERROR_STATE() retorna o estado do erro.

ERROR_LINE() retorna o número da linha do erro.

ERROR_PROCEDURE() retorna o nome da stored procedure/trigger. NULL se não houver stored procedure/trigger.

ERROR_MESSAGE() retorna o texto da mensagem de erro.

Transações e tratamento de erros no SQL Server

Funções de erro — exemplos

BEGIN TRY
    INSERT INTO products (product_name, stock, price)
        VALUES ('Trek Powerfly 5 - 2018', 10, 3499.99);
END TRY
BEGIN CATCH
    SELECT  ERROR_NUMBER() AS Error_number,  
            ERROR_SEVERITY() AS Error_severity,  
            ERROR_STATE() AS Error_state,  
            ERROR_PROCEDURE() AS Error_procedure,  
            ERROR_LINE() AS Error_line,  
            ERROR_MESSAGE() AS Error_message;             
END CATCH
| Error_number| Error_severity| Error_state| Error_procedure| Error_line| Error_message                                       |
|-------------|---------------|------------|----------------|-----------|-----------------------------------------------------|
| 2627        | 14            | 1          | NULL           | 2         | Violação da restrição UNIQUE KEY 'unique_name'...   |
Transações e tratamento de erros no SQL Server

Funções de erro — exemplos

Última saída

| Error_number| Error_severity| Error_state| Error_procedure| Error_line| Error_message                                       |
|-------------|---------------|------------|----------------|-----------|-----------------------------------------------------|
| 2627        | 14            | 1          | NULL           | 2         | Violação da restrição UNIQUE KEY 'unique_name'...   |

Informações originais do erro

Msg 2627, Level 14, State 1, Line 1
Violação da restrição UNIQUE KEY 'unique_name'. Não é possível inserir chave duplicada no objeto 'dbo.products'. O valor da 
chave duplicada é (Trek Powerfly 5 - 2018).
Transações e tratamento de erros no SQL Server

Funções de erro — exemplos

SELECT  ERROR_NUMBER() AS Error_number,  
        ERROR_SEVERITY() AS Error_severity,  
        ERROR_STATE() AS Error_state,  
        ERROR_PROCEDURE() AS Error_procedure,  
        ERROR_LINE() AS Error_line,  
        ERROR_MESSAGE() AS Error_message;
| Error_number | Error_severity | Error_state | Error_procedure | Error_line | Error_message |
|--------------|----------------|-------------|-----------------|------------|---------------|
| NULL         | NULL           | NULL        | NULL            | NULL       | NULL          |
Transações e tratamento de erros no SQL Server

Funções de erro em TRY...CATCH aninhados

BEGIN TRY
    INSERT INTO products (product_name, stock, price)
        VALUES ('Trek Powerfly 5 - 2018', 10, 3499.99);
END TRY
BEGIN CATCH
    BEGIN TRY
        INSERT INTO myErrors
            VALUES ('ERROR!')
    END TRY    
    BEGIN CATCH
        SELECT  'Bloco CATCH externo' AS 'Error_from',
            ERROR_NUMBER() AS Error_number,       
            ERROR_MESSAGE() AS Error_message; 
    END CATCH    
END CATCH
| Error_from        | Error_number | Error_message                                   |
|-------------------|--------------|-------------------------------------------------|
| Bloco CATCH externo | 8152         | String or binary data would be truncated.       |
Transações e tratamento de erros no SQL Server

Vamos praticar!

Transações e tratamento de erros no SQL Server

Preparing Video For Download...