Pular para o conteúdo principal

Postagens

Mostrando postagens de 2015

Como converter e formatar a exibição de horas decimais com SQL Server - parte 2

Este artigo é uma continuação da primeira parte onde são explicados os passos para a conversão de horas no formato decimal para o padrão para horas (HH:MM).O objetivo é demonstrar como criar uma função do SQL Server para representar o tempo corrido em horas e minutos no formato correto uma vez tendo armazenado este valor em formato decimal para fins de cálculo. Eu recomendo a leitura do artigo acima para que se tenha uma visão geral do assunto e o seu pano de fundo.Inicialmente pode parecer um trabalho desnecessário criar uma função específica para esta finalidade principalmente por que a função CONVERT possui vários recursos que possibilitam realizar a tarefa acima, mas, quando se começa a explorar as possibilidades, percebe-se que o trabalho de achar o formato correto dos parâmetros e o número de cálculos que se tem de executar incluindo conversões em cascata, chamadas de diversas funções e operações diversas com datas é praticamente o m…

Como converter e formatar a exibição de horas decimais com SQL Server - parte 1

Esta publicação demonstra como converter números decimais usados para armazenar duração de tempo para a representação no formato de horas e minutos usando as funções do SQL Server 2008.O objetivo é permitir representar números armazenados no formato decimal no banco de dados para facilitar o cálculo usando-se o formato padrão para horas e minutos, HH:MM, assim, por exemplo, 1,5 que refere-se à duração de uma hora e meia poderá ser representado como 01:30.Como a proposta deste blog é manter as coisas simples e principalmente, atender a um público que está iniciando na programação, não serão considerados nos cálculos a duração em segundos e centésimos para que os cálculos fiquem simples. A versão mínima do SQL Server para poder executar este exemplo é a 2008 R2 sendo que é possível usar a sua versão gratuita (SQL EXPRESS EDITION). Nesta primeira parte serão demonstrados os passos necessários para realizar as conversões de base numérica. Na segunda, será dado o exemplo de uma fun…

Treinamento para consultas com SQL Server - Parte 10 (Final) - Introdução a índices e otimização

Um banco de dados com alto desempenho em todas as consultas é como a ciência de construir foguetes: difícil, inexata e cada caso merece uma atenção especial. Por isso neste tópico não é possível colocar o assunto em pauta, uma vez que demandaria um tempo muito grande. Por isso, serão tratados alguns casos que penalizam as consultas por não utilizarem corretamente a indexação do banco e que devem ser evitados ou mitigados sempre que forem encontrados.No final, colocarei uma dica sobre como construir índices eficientes no SQL Server, porque, infelizmente, não basta que eles existam, tem de ser criados do jeito certo.Alerta sobre desempenhoA preocupação com o desempenho das consultas deve estar embutida no design do banco de dados. É muito mais difícil otimizar um banco com milhões de registros com gargalos de desempenho e vários usuários conectados o tempo todo. Verifique a previsão de crescimento do banco ao realizar seu projeto. (Ou peça que seu líder de projeto faça isso).LikeEsta in…

Treinamento para consultas com SQL Server - Parte 9 - Medidas de Segurança Iniciais

O trabalho com bancos de dados muitas vezes será feito em ambiente de produção, embora se recomende que isso seja evitado ao máximo.Com isto aumenta significativamente o risco de se executar alguma consulta de atualização dos dados que cause problemas. Um DELETE ou UPDATE sem WHERE, por exemplo, já é o suficiente para tirar o sono do desenvolvedor durante muito tempo.Alguns bancos de dados mais antigos e portanto, há mais tempo no mercado, como o ORACLE, exigem em todas as suas ferramentas de DML que o COMMIT seja sempre explícito, ou seja, para as modificações tanto dos dados como da estrutura de tabelas serem persistidas a instrução deve conter esta instrução, caso contrário, os resultados estarão pendentes até fechar a sessão e no momento em que isso é feito, um ROLLBACK é executado automaticamente.O SQL Server ainda não possui este recurso. Toda e qualquer consulta executada está no modo AUTO COMMIT. Assim, para evitar problemas causados por este tipo de configuração, este documen…

Treinamento para consultas com SQL Server - Parte 8 - FOR XML

Este recurso – que existe de outras formas em diversos bancos de dados, permite que os resultados de uma consulta sejam recuperados no formato XML. Além disso, dependendo das configurações dos parâmetros, é possível fazer uma espécie de pivoteamento transformando as linhas e colunas da consulta em uma única string, usando delimitadores para colunas e linhas.Outro aspecto importante é que, através de FOR XML, os dados podem ser transformados para que sejam compartilhados com aplicações diversas.O ponto principal para conseguir este resultado é transformar o retorno com a função PATH() no final da instrução. Para obter o resultado desejado, basta passar uma string vazia como parâmetro.Considere a consulta do exemplo anterior onde cada PERSON tinha um resumo com a soma das vendas dos anos 2005-2007 sendo exibidas em cada coluna. Vamos transformar esta consulta para que para cada nome seja retornada um texto onde os registros estão separados por ponto e vírgula “;” e as colunas por “|”.A …

Treinamento para consultas com SQL Server - Parte 7 - Sub Consultas (SUBQUERIES)

Este é um recurso muito útil na linguagem SQL permitindo colocar o resultado de consultas inteiras em uma coluna fazendo parte das linhas de uma consulta maior. Uma consulta pode ter quantas sub consultas forem necessárias, mas, existem alguns pontos de atenção:O resultado da sub consulta deve ser sempre escalar, ou seja, um valor único, nunca um conjunto de linhas e colunas (rowset). Pode ser necessário usar a cláusula TOP em alguns casos.Para evitar problemas, a sub consulta deve estar amarrada com alguma coluna da consulta principal.Verificar os índices das tabelas envolvidas se estão apropriados. As sub consultas têm um custo muito alto de processamento e afetam em muito o desempenho caso sejam muito complexas.Para exemplificar vamos considerar as tabelas PERSON.PERSON, SALES.SALESORDERHEADER – armazena informações sobre vendas e SALES.CUSTOMER – Clientes para o qual a venda foi feita. O diagrama de relacionamentos pode ser conferido a seguir. O objetivo é ter o resultado da somató…

Treinamento para consultas com SQL Server - Parte 6 - CASE

Em linguagens de programação como o C e C# este conjunto de instruções serve para testar vários valores de uma mesma variável e executar um bloco específico de instruções.Na Linguagem SQL, CASE é usado para testar o valor de uma expressão e retornar um valor escalar conforme o resultado obtido. Este tipo é útil principalmente quando códigos que detém a regra de negócios são armazenados no banco e não possuem tabelas relacionadas.Sua sintaxe básica segue o padrão demonstrado a seguir: CASE <expressão> WHEN <valor1> THEN <Retorno1> WHEN &lt.valor2> THEN <Retorno2> … WHEN <valorn> THEN <retornon> -- ELSE é OPCIONAL ELSE <Retorno alternativo> END Podem existir quantos WHEN forem necessários, mas, o valor a ser testado precisa ser escalar, ou seja, um valor simples, não pode ser uma expressão ou um rowset. Na tabela PERSON.PERSON existe a coluna PersonType que armazena o tipo de pessoa que os dados representam. Esta coluna não possui…

Treinamento para consultas com SQL Server - Parte 5 - Funções

A especificação da linguagem SQL ANSI prevê algumas funções incorporadas a esta. O SQL Server possui além das que são padrão suas próprias implementações além de permitir que o usuário crie suas próprias.Além de consultar a documentação do produto outra forma de se conhecer quais funções estão disponíveis é através da ferramenta SSMS na janela Pesquisador de Objetos, dentro do banco de dados selecionado e procurar o item Programação > Funções > Funções do sistema. Estes locais mostram a lista das funções suportadas pela versão do SQL Server instalada conforme está exibido na figura a seguir. Neste tópico serão abordadas as principais destas e que são as mais usadas no trabalho diário.Funções de agregaçãoPermitem fazer operações de soma, contagem, média, etc. sobre colunas.Caso dentro da consulta existam colunas que não estejam cobertas por uma função deste tipo, as mesmas devem vir enumeradas e precedidas pela cláusula GROUP BY.SUM(). Retorna a…

Treinamento para consultas com SQL Server - Parte 4 - UNION

Esta palavra chave (ou operador) é usada quando se deseja unir resultados de consultas diferentes em um mesmo conjunto de linhas (resultset ou rowset). É possível usar tanto repetindo os resultados que estão em duas ou mais consultas unidas como, fazendo com que apareçam apenas os resultados que não estão repetidos.Com UNION se consegue reunir o resultado duas ou mais consultas havendo, porém, algumas restrições:O número das colunas retornadas deve ser o mesmo em todas as tabelasO tipo das colunas também deve ser o mesmo em todas as consultasA cláusula ORDER BY só poderá ser colocada ao final de todas as consultas, não sendo possível usar em cada consulta individualmente.Union com repetição de resultadosSe for usada somente a cláusula UNION os resultados que forem comuns em todas as consultas serão repetidos. Considere a tabela PERSON.PERSON, na consulta abaixo são listados os nomes dos registros para quando se tem uma pessoa de contato informada e se possui dados de cartã…

Treinamento para consultas com SQL Server - Parte 3 - Filtros usando a cláusula WHERE

Os filtros são uma forma de restringir o número de registros que são retornados por uma consulta. Você DEVE SEMPRE USAR filtros. Mesmo que os seus projetos os bancos estejam muito pequenos. Em algum ponto do tempo isso irá mudar e um filtro bem feito pode fazer a diferença entre uma consulta executando com rapidez e outra que se torna lenta com o decorrer do tempo.A forma mais comum de se implementar os filtros na linguagem SQL é através da cláusula WHERE onde a sintaxe básica é a seguinte: SELECT [colunas] FROM [tabelas] JOIN [mais tabelas] WHERE [condição1] AND | OR [condição2] ... AND | OR [condiçãon] O WHERE é colocado sempre depois das tabelas e relacionamentos. Podem existir tantas condições quantas forem necessárias, mas, a única forma de conectar estas é através das palavras chave AND e OR e aqui está um ponto importante pois a maneira certa de usar estes dois operadores causa uma diferença muito grande no resultado final.Dependendo da consulta desejada, da posição da…

Treinamento para Consultas com SQL Server – Parte 2 - JOINS - Outros tipos de joins

No post anterior faltou acrescentar alguns detalhes sobre LEFT JOINS que coloco agora.
Use LEFT JOIN quando:
O objetivo for listar todos os registros de uma tabela e mostrar colunas de outra havendo ou não correspondências.Precisar saber se existem registros filhes de uma tabela pai em uma (ou várias) filho. Não use para fazer filtros, conforme foi demonstrado com INNER JOIN.
A maneira de restringir (condições de busca) também é semelhante ao INNER JOIN. Uma questão sobre desempenho O desempenho com LEFT JOIN é melhor do que com INNER JOIN, porém, pode ser que em alguns casos seja necessário usar mesmo o INNER. Usando CROSS JOIN (na verdade é melhor nem usar) Este tipo de JOIN está aqui meramente para exemplo pois causa muitos problemas. Consiste em vez de usar o termo JOIN, colocar as tabelas relacionadas na cláusula FROM.
SELECT [TABELA1.COLUNAS] ...
   ,[TABELA2.COLUNAS...]
   , ...
   ,[TABELAn.COLUNAS...]
FROM [TABELA1], [TABELA2], ..., [TABELAn]
O problema aqui é que este tipo de JOI…