Neste artigo irei explicar de maneira simples como utilizar o Try…Catch e o Transaction no SQL Server.
A idéia de se utilizar estes recursos é basicamente para evitar que erros causados em alguma transação SQL (StoreProcedure, por exemplo) gerem problemas de dados inconsistentes em sua base de dados.
Um exemplo prático é aquela sua store procedure que realiza diversas transações (inserts, deletes, updates) e devido a alguma falha em uma destas transações, seus dados ficam incompletos e você precisa ficar caçando o que foi inserido, atualizado, etc.
Para ilustrar, criaremos uma tabela em um banco de dados teste conforme exemplo:
Create Table TbTransacao (id_trans int identity, num_teste int)
Imaginando um processo normal, sem erros, ilustramos os insert´s abaixo:
insert into TbTransacao values (1)
insert into TbTransacao values (5)
insert into TbTransacao values (3)
Até aqui, sem nenhuma novidade, porem imagine que ao inves do numero (5) no 2º insert, sua aplicação ou processamento SQL retornou o número (55555555555555). Ao tentar realizar o insert em questão, o erro será apresentado.
insert into TbTransacao values (1)
insert into TbTransacao values (55555555555555)
insert into TbTransacao values (3)
Neste caso, ao consultar a tabela você teria apenas os registros 1 e 3 e seus dados estariam inconsistentes.
Para ilustrar o Try..Catch, irei limpar os registros da tabela.
truncate table TbTransacao
Utilizando o Try..Catch e Transaction, o processamento como um todo não ocorreria, fazendo com que os dados de sua tabela ficassem consistentes.
Begin Transaction — Iniciando Transação
Begin Try
insert into TbTransacao values (1)
insert into TbTransacao values (55555555555555)
insert into TbTransacao values (3)
End Try
Begin Catch
If @@TRANCOUNT > 0
Rollback Transaction –Realiza o rollback
GOTO _ERRO –Pula direto para o rótulo “_Erro”.
End Catch
If @@TRANCOUNT > 0 –Caso seja 1, realiza a transação.
Commit Transaction
_ERRO: –Rótulo _Erro
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;
Ao executar a transação acima, o select abaixo do rótulo _ERRO será exibido com a coluna ErrorNumber preenchida com o valor do Erro.
Caso a transação seja executada sem problemas, o select do rótulo _ERRO será realizado com o ErrorNumber igual a Null.
Begin Transaction — Iniciando Transação
Begin Try
insert into TbTransacao values (1)
insert into TbTransacao values (5)
insert into TbTransacao values (3)
End Try
Begin Catch
If @@TRANCOUNT > 0
Rollback Transaction –Realiza o rollback
GOTO _ERRO –Pula direto para o rótulo “_Erro”.
End Catch
If @@TRANCOUNT > 0 –Caso seja 1, realiza a transação.
Commit Transaction
_ERRO: –Rótulo _Erro
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;
Acredito que esta funcionalidade pode ajudar e muito no desenvolvimento SQL do dia a dia.
Até breve…
Filed under: SQL Server | Leave a Comment
Tags: procedure, query, sql, SQL Server, t-sql
Funções SQL Server
Há algum tempo estava com dúvida de uma função do SQL Server e nas pesquisas da vida, encontrei em um site o conteúdo abaixo. Achei muito interessante e resolvi compartilhar.
Funções de agrupamento:
AVG() = Retorna o valor médio de uma coluna específica
BINARY_CHECKSUM() = O valor do BINARY_CHECKSUM computado sobre uma linha ou uma tabela ou sobre uma lista de expressões. BINARY CHECKSUM é usada para detectar alterações em uma linha ou uma tabela.
CHECKSUM() = O valor de CHECKSUM computado sobre uma linha ou uma tabela, ou sobre uma lista de expressões. CHECKSUM é usada para construir índices de hash.
CHECKSUM_AGG() = O valor de CHECKSUM de um grupo. Valores nulos são ignorados.
COUNT() = Retorna o número de linhas
COUNT_BIG() = igual ao COUNT mas o COUNT_BIG sempre retorna um tipo de dados bigint.
MAX() = Retorna o valor máximo de uma coluna específica
MIN() = Retorna o valor mínimo de uma coluna específica
SUM() = Retorna a soma de uma coluna específica
STDEV() = Desvio padrão de todos os valores
STDEVP() = Desvio padrão da população
VAR() = Variância estatistica de todos os valores
VARP() = Variância estatística de todos os valores da população
Funções de manipulação de strings:
ASCII(string) = pega o valor em ASCII da string
CHAR(integer) = troca inteiro do ASCII em um caracter
LEN(string) = Identifica o comprimento de uma expressão em caracteres
LOWER(string) = converte uma string uppercase para lowercase.
LTRIM(string) = remove os espaços em branco
PATINDEX(posicao, expressao) = devolve a posicão de uma string dentro de um texto. Se não encontrar, retorna zero.
REPLICATE(string, integer) = Repete N vezes um caractere especificado
REVERSE(string) = retorna o inverso de uma expressao
RTRIM (string) = remove os espaços em branco à direita de uma string
SPACE(integer) = que retorna o número de espaços em branco informados no parâmetro
STUFF(string texto, X, Y, string texto_a_inserir) = apaga da string “texto” os y caracteres a partir da posição x e os substitui por “texto_a_inserir”
SUBSTRING(string texto, posicao_inicial, tamanho) = retorna uma string com o comprimento definido em “tamanho” extraida da string “texto”, a partir da “posicao_inicial”
UPPER(string) = retorna string em maiusculas
Funções de manipulação de data/hora:
nomes das partes de data:
Year = yy, yyyy
Quarter = qualquer, que
Month = mm, m
Dayofyear = dy, y
Day = dd, d
Week = wk, ww
Hour = hh
Minute = mi, n
Second = ss, s
Millisecond = ms
DATEADD (parte, numero, data) = adiciona um valor a parte de uma data
DATEDIFF (parte, data inicial, data final) = subtrai a data inicial da data final, indicando o resultado na unidade definida em “parte”
GETDATE() = retorna a data atual do sistema
DATENAME (parte, data) = retorna o nome da parte de uma data
DATEPART(parte, data) = retorna a parte de uma data
Funções de Sistema:
CAST(expressao as datatype) = converte uma expressao no datatype informado
COL_LENGTH(nome_da_tabela, nome_da_coluna) = retorna o tamanho da coluna
COL_NAME(id_da_tabela, id_da_coluna) = retorna o nome da coluna
DATALENGTH(expressao) = retorna o numero de bytes usados para armazenar a expressao
DB_ID(nome_do_banco) = retorna o ID do banco informado
DB_NAME(id_do_banco) = retorna o nome do banco
HOST_ID() = retorna a ID da estação que está acessando o SQL Server
HOST_NAME() = retorna o nome da estação que está acessando o SQL Server
IDENT_INCR(nome_da_tabela_ou_view) = retorna o valor incrementado
IDENT_SEED(tabela_ou_view) = retorna o valor inicial da coluna
INDEX_COL(nome_da_tabela, indice_id, chave_id) = retorna o nome da coluna que participa do índice
ISNULL(expressao, valor) = se a expressao for null, troca pelo valor especificado
ISNUMERIC(expressao) = retorna 1 se a expressao for numerica e 0 se não for
NEWID() = retorna um novo valor do tipo uniqueidentifier
NULLIF(expressao_1, expressao_2) = retorna nulo se as duas expressoes forem equivalentes. Se não forem, retorna a primeira expressao.
OBJECT_ID(nome_do_objeto) = retorna o ID de um objeto, a partir do nome fornecido
OBJECT_NAME(ID_do_objeto) = retorna o nome do objeto, a partir do ID fornecido
PARSENAME(objeto, parte) = retorna a parte do nome de um objeto, desde que tenha sido qualificado
STATS_DATE(tabela_id, indice_id) = retorna a data em que as estatísticas do índice foram atualizadas
SUSER_SID(nome_do_usuario) = retorna o ID do usuario informado
SUSER_NAME(usuario_id) = retorna o id do usuário no servidor. O argumento é opcional.
SUSER_SNAME(id_do_usuario) = retorna o nome do usuario informado. Se nenhum ID de usuario for passado para a função, retorna o nome do usuario logado
USER_ID(nome_do_usuario) = retorna o ID do usuario informado para o BD em uso
USER_NAME(id_do_usuario) = retorna o usuario conectado ao BD
Funções Matematicas:
ABS(numero) = retorna o valor absoluto do numero
ACOS(float) = retorna o arco-coseno do numero informado
ASIN(float) = retorna o arco-seno do numero informado
ATAN(float) = retorna o arco-tangente do numero informado
ATN2(Float expressao_1, float expressao_2) = Arco-tangente do valor definido pela divisão da primeira expressão pela segunda
CEILING(numero) = retorna o menor inteiro que seja maior ou igual ao numero informado
COS(float) = retorna o coseno do numero informado
COT(float) = retorna o cotangente do numero informado
DEGREES(numero) = converte radianos para graus
EXP(float) = retorna o exponencial de um numero especificado
FLOOR(numero) = retorna o maior inteiro que seja menor ou igual ao numero informado
LOG(float) = retorna o logaritmo natural do numero informado
LOG10(float) = retorna o logaritmo base 10 do numero informado
PI() = retorna o valor de PI 3.1415926535897931.
POWER(numero, potencia) = retorna o valor elevado à potencia informada
RADIANS(numero) = converte graus para radianos
RAND(expressao) = um número aleatório entre 0 e 1. Expressão é opcional e será usada como semente da cadeia pseudo-aleatória
ROUND(numero, precisao, arredonda_ou_trancar) = arredonda ou tranca o numero fornecido de acordo com a precisao informada. Se o terceiro parametro não for passado para a funçao, o numero é arredondado. Se quiser que o numero seja truncado, deve-se fornecer o valor 1
SIGN(numero) = retorna sinal positivo, negativo ou zero do numero
SIN(float) = retorna o seno do angulo especificado
SQRT(float) = retorna a raiz quadrada de um numero
TAN(float) = retorna a tangente de um numero informado
SQUARE(float) = retorna o quadrado de um numero
Função de conversão:
CONVERT(tipo(tamanho), expressão, estilo) = converte a expressão para o tipo de dado. O tamanho e o estilo são opcionais
Espero que seja útil!
Até breve…
Filed under: SQL Server | Leave a Comment
Tags: SQL Server, t-sql
Link comparativo VB.Net x C#
Encontrei um link interessante que mostra os principais comandos em VB.Net e em C#, mostrando suas diferenças de sintaxe.
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
Até breve…
Filed under: VB.Net, c# | Leave a Comment
Tags: c#, diferenças, sintaxe, VB.Net
Asp.Net – exportar para excel
Este artigo tem como objetivo mostrar a exportação em .net para o Excel.
Geralmente em aplicações Asp.net, há paginas com gridview, por exemplo, que precisam ser exportadas para o Excel e o passo a passo a seguir irão explicar, de maneira simples, como fazer isso.
1- Em uma nova página Asp.net, adicionei um gridview conforme abaixo:

2- No codebehind desta página (Page_Load), criei um datatable com duas colunas e populei ele através de um “For” apenas para ilustrar meu gridview preenchido.

Ao executar esta página, o resultado será abaixo:

3- Para fazer com que este conteúdo seja exportado ao Excel, basta adicionar o comando “Response.ContentType = “application/vnd.ms-excel”;” no Page_Load da página e pronto.

No código acima, foi incrementado o comando “Response.AddHeader” para definir o nome do arquivo.
4- Ao executar, será exibido a página abaixo:

5- O resultado final (já em Excel) será :

Este é um exemplo bem simples, mas que acredito que possa ajudar e bastante no dia-a-dia.
Até breve.
Filed under: asp.net | Leave a Comment
Tags: asp.net, Excel, export
Problemas com lentidão em sua aplicação/website? Em muitos casos o problema pode estar ocorrendo por uma query mal programada que está sendo executada em seu banco de dados.
Para identificar qual a query que pode estar com problemas, o script abaixo retorna o consumo das requisições em seu banco de dados, exibindo a quantidade de requisições de um determinada query, procedure, etc, separando isso por cada database de seu SQL Server.
NOTA: Para executar o script abaixo, você deve estar utilizando o database master
SELECT TOP 20
[Average CPU used] = total_worker_time / qs.execution_count
,[Total CPU used] = total_worker_time
,[Execution count] = qs.execution_count
,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE qs.statement_end_offset END – qs.statement_start_offset)/2)
,[Parent Query] = qt.text
,DatabaseName = DB_NAME(qt.dbid)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
–WHERE DB_NAME(qt.dbid) = ‘pnl’ — Filtro por database
WHERE qs.execution_count > 1
ORDER BY [Average CPU used] DESC;
Saudações…
Filed under: SQL Server | Leave a Comment
Tags: lentidão, performance, query, SQL Server



