quarta-feira, 8 de setembro de 2010

Dica: Número de linhas afetadas por um comando SQL

Quando executamos comandos de SELECT/INSERT/UPDATE/DELETE sobre tabelas ou Views em um banco de dados SQL Server, o número de linhas afetadas pelo comando é registrado no console do Management Studio (ou Query Analyzer até a versão 2000).

Entretanto, existem casos em que este número pode ser importante para a lógica de uma aplicação, ou mesmo para decidir se uma tarefa foi executada com sucesso ou não.

Assim, o SQL Server permite recuperar esta informação através da variável @@ROWCOUNT. A cada execução de comando, esta variável é atualizada e passa a conter o número de linhas afetadas pelo comando executado.

Veja como utilizá-la no exemplo abaixo:

-- Criando tabela temporária para testar o uso de @@ROWCOUNT
CREATE TABLE #teste (id INT)      

-- Inserindo um único registro na tabela #teste
INSERT INTO #teste VALUES(0)           
SELECT @@ROWCOUNT 


-- Inserindo vários (3) registros na tabela #teste
INSERT INTO #teste VALUES(10),(20),(30)
SELECT @@ROWCOUNT


-- Selecionando todos os registros da tabela #teste
SELECT * FROM #teste                   
SELECT @@ROWCOUNT


-- Removendo tabela temporária
DROP TABLE #teste                

Veja o resultado da execução deste script na figura abaixo:


Um bom exemplo de aplicação para esta variável seria em uma Stored Procedure que realiza uma operação de insert/update/delete. Através dessa variável, pode-se criar uma validação para retornar o status da operação (sucesso/fracasso) baseado no número de linhas afetadas.

terça-feira, 7 de setembro de 2010

Tratamento de erros no SQL Server (TRY-CATCH)

Em linguagens de progamação como C# e Java, é comum o uso do bloco TRY-CATCH para tratar as exceções lançadas durante a execução das aplicações.

Ao implementar Stored Procedures, Funções e Triggers, ou mesmo batches mais complexos, pode ser necessário tratar os possíveis erros ocorridos nos comandos.

Até a versão 2000 do SQL Server, era necessário utilizar a função de sistema @@ERROR após cada um dos comando executado, pois o valor de retorno dessa função é reiniciao a cada comando executado.

As versões 2005 e 2008 do SQL Server permitem implementar o tratamento de erros através do bloco TRY-CATCH, de maneira semelhante às linguagens de programação convecionais. 

Este bloco é formado por dois sub-blocos:

TRY - contém os comandos necessários para executar a tarefa desejada
CATCH - contém os comandos para tratamento de possíveis erros ocorridos no bloco TRY

Quando um erro ocorre no dentro do bloco TRY a execução é desviada para o bloco CATCH, o que permite continuar a execução do script ou interrompê-lo, de acordo com as necessidades do usuário e gravidade do erro gerado.
Sintaxe
A sintaxe definida para este bloco de comandos é a seguinte

BEGIN TRY
     [comandos SQL para execução de uma tarefa]
END TRY
BEGIN CATCH
     [comandos SQL para tratamento do erro]
END CATCH

Exemplo
Abaixo, temos um tratamento de erro realizado através deste bloco de comandos:

-- Criando tabela para teste
CREATE TABLE #teste (id int)

-- Adicionando restrição à tabela.
-- Somente IDs menores do que 10 serão aceitos

ALTER TABLE #teste ADD CONSTRAINT chkID CHECK (id < 10)

-- Executando a tarefa em transação
BEGIN TRANSACTION

BEGIN TRY
       
    INSERT INTO #teste VALUES (5)
    INSERT INTO #teste VALUES (2)
    INSERT INTO #teste VALUES (13)  -- Inserção de ID inválido

    COMMIT TRANSACTION -- Efetivando alterações na base

END TRY
BEGIN CATCH
   
    PRINT 'Erro ao executar script'
    ROLLBACK TRANSACTION -- Desfazendo as alterações na base
         
END CATCH

SELECT * FROM #teste

DROP TABLE #teste

Ao executar o script, obtemos o resultado abaixo. Verifique que nenhuma linha foi inserida na tabela #teste.

As mensagens exibidas no console do SQL estão abaixo:


Observe que nenhuma mensagem de erro do sistema foi lançada. Apenas a mensagem do tratamento foi exibida.
Informações sobre o erro
O SQL Server permite recuperar as informações do erro lançado no bloco TRY, através de algumas funções do sistema:

ERROR_NUMBER() -Retorna o número do erro ERROR_MESSAGE() - Exibe a mensagem do erro ERROR_SEVERITY() - Retorna o grau de severidade do erro ERROR_LINE()  - Retorna a linha em que o erro ocorreu

Referências
http://msdn.microsoft.com/pt-br/library/ms175976.aspx