Postagens

Mostrando postagens com o rótulo sql

6 maneiras de fazer a mesma coisa, o que é considerado boas práticas?

As vezes tem tantas maneiras diferentes de fazer o mesmo código que nós ficamos na dúvida quanto a qual maneira usar. O que seria considerado "boa prática" pela comunidade e o que sua equipe entenderia melhor. Suponhamos que você esteja trabalhando dentro de um método de um Domain Service chamado UmDomainServiceChique(objetoDoDominio) que será chamado por uma API. Você tem uma regra de negócio chique para ser verificada que por enquanto chamarei de VerificaMinhaRegraChiqueComplexa(). Você chama UmDomainServiceChique(objetoDoDominio) e caso VerificaMinhaRegraChiqueComplexa() retorne true você vai querer que UmDomainServiceChique faça o que tem que fazer e a api retornar Ok 200, caso contrário você quer que a API responda um erro qualquer, tipo BadRequest, e retornar uma mensagem dizendo que VerificaMinhaRegraChiqueComplexa deu ruim. Eu vejo 6 maneiras de fazer isso, gostaria de saber a opinião de outrs devs sobre qual seria a maneira menos gambiarr...

Função para criar nova data em SQL

O SQL 2012 e superior tem a função DATEFROMPARTS para criar uma nova data a partir dos inteiros Ano, Mes e Dia, mas as versões 2000, 2005 e 2008 como é que fica? Fica assim: você mesmo faz a função. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ############################################################################################################################################ -- # NOME : DATEFROMPARTS -- # PRODUTO : SQL Server -- # DEVELOPER : Vitor Luiz Rubio -- # COPYRIGHT : -- # OBJETIVO : Gerar uma data a partir dos seus componentes inteiros -- # VERSAO : 1.0 -- # DT. CRIACAO : 2013-04-18 -- # DT. ALTERACAO : -- # -- # DEPENDENCIAS : -- # -- # DEPENDENTES : -- # -- # HISTÓRICO -- # 2013-04-18 : Criação -- # -- ############################################################################################################################################ CREATE FUNCTION DATEFROMPARTS ( @Year int, @Month int, @Day int ) RETURNS datetime AS BEGIN --da...

Duas maneiras de listar as chaves estrangeiras de um banco de dados

AS vezes precisamos listar todas as chaves estrangeiras de um banco de dados (e as tabelas/campos referenciados pelas mesmas). Tanto para automação de nosso mecanismo de persistência como para documentação do banco de dados. Em algumas operações nós precisamos excluir todas as constraints, para fazer alguma manutenção ou inclusão desconsiderando-se a integridade referencial (geralmente ao passar dados de um banco para outro, cargas, restaurações etc), sendo estas recriadas depois. A consulta pelas chaves estrangeiras pode ser feita usando-se as tabelas de sistema sysobjects e syscolumns ou as views de sistema INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS e INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE. Usando sysobjects  e syscolumns SELECT o3.name 'Nome_Chave_Estrangeira', o2.name 'Tabela', sc1.name 'Coluna (FK)', o1.name 'Tabela Referenciada', sc2.name 'Coluna Referenciada (PK)'foreign key ('+sc1.name+') references '+o1....

Duas funções úteis para manipulação de datas

Imagem
De tempos em tempos precisamos fazer aquele processamento que só pode ser feito em dias úteis. Seja a data de pagamento de um boleto, o agendamento de uma entrevista e assim por diante. O desafio disso está no fato de que temos feriados nacionais com dia fixo, feriados com dia variável porém computável (através de algoritmos) e feriados municipais. Os municipais não tem outra forma de atender senão consultando uma tabela do banco de dados pelo código do município, mas os feriados nacionais fixos nós podemos dar uma bom começo. Segue abaixo a função fn_dia_util que retorna 1 se o dia for útil e 0 se for sábado, domingo ou feriado (usando a função weekday para isso) e a função fn_proximo_dia_util, que verifica se o próximo dia é util e se não for vai acrescentando um em loop. Mesmo se o feriado cair numa sexta-feira ela retornará o próximo dia útil. -- ##############################################################################################################################...

Consultando apenas os registros "sujos" em uma tabela com Microsoft SQL Server

Imagem
Lidando com bancos de dados podemos controlar as transações e a maneira como podemos acessar os dados em transações concorrentes. Os níveis de isolamento de transação e os comandos para tais serão discutidos em um próximo post, porém, resumidamente, temos (Serializável, snapshot, repeatable read, read commited, read uncommited). Dirty read (read uncommited ou nolock) nos permitem visualizar os dados de uma tabela mesmo sendo sujos (alterados em outras transações). Isso garante, com certo nível de inconsistência se as transações forem desprezadas e o  rollback usado, uma leitura o mais rápido possível dos dados no seu estado atual quase que em tempo real. No entanto, como separar os dados "sujos" daqueles que já estavam gravados e commitados? Imagine que você tem um ambiente onde um sistema legado permite que a aplicação seja fechada, após uma exception ou queda de rede, sem dar commit ou rollback nas transações correntes. Você rapidamente ficaria com várias transações...

Validação e conversão de datas

Dentre os problemas mais recorrentes em sistemas podemos citar os relacionados à cultura: charset, datas e formatação de números. Datas são especialmente problemáticas porque podem ser ambíguas dependendo da cultura, por exemplo 02/01/1990 pode ser dois de janeiro no Brasil ou primeiro de fevereiro nos EUA. Ainda mais agravante é o fato de nem sempre podermos validar as datas nos imputs, pois as mesmas podem vir de arquivos de integração, outros sistemas, CSV, TXT, Excel ou webservices. Pensando nisso eu fiz uma pequea demonstração do uso dos comandos cast e convert para converter varchar para datas e datas para varchar, e mostrando onde estão os erros mais comuns. /******************************************************************************************************* ******************************** DEMONSTRAÇÃO DE CONVERSÃO DE DATAS ************************************ ********************************************************************************************************/ --i...

Fazer uma consulta no SQL Server e enviar o resultado por e-mail, usando C#

Esse é um exemplo em C# que eu sempre passo para todo mundo que está começando na linguagem e quer aprender qualquer coisa um pouco mais complexa do que um "hello world". Trata-se de um script / função que consulta um banco de dados e devolve o resultado, como um relatório, por e-mail. Então dois temas são abordados: conexão com o banco de dados consultando-o e envio de e-mail. uso C# para me conectar com um banco de dados MS SQL Server e fazer uma query. O resultado da query é enviado por e-mail, como texto, no corpo do mesmo. Originalmente escrevi esse programa como exemplo para um colega não programador, que já sabia programar um pouco, porém no VBA do Excel, e que já conhecia o Microsoft SQL Server muito bem e sabia fazer queries e trazê-las para uma planilha excel, mas não conhecia nada de C# e não tinha vivência como programador. No entanto este tutorial também é destinado à webdesigners que precisam fazer um script para envio de e-mail, mas não querem se aprofunda...

Deletar todas as tabelas de um banco SQL Server

As vezes, quando estamos desenvolvendo software, precisamos simplesmente apagar todas as tabelas e recriá-las novamente, mas isso é impossível de se fazer caso existam chaves estrangeiras e outras constraints ou dependências dessas tabelas. Você pode ter tentado o comando EXEC sp_MSForEachtable 'DROP TABLE ?' , que é uma stored procedure não documentada que já vem de fábrica com o SQL e que executa um mesmo comando em cada tabela do banco de dados, substituindo ? pelo nome da tabela. Mais sobre sp_MSForEachtable Mesmo a sp_MSForEachtable não funcionaria para todas as tabelas. O ideal é que se apague tudo na ordem correta, ou se recrie o banco. Entretanto, se você deseja apagar as tabelas mas permanecer com suas procedures, por exemplo, e rodar o script para recriar as tabelas depois, você pode fazer o seguinte: 1) Conheça a view INFORMATION_SCHEMA.TABLE_CONSTRAINTS.  Essa é uma  view de sistema que mostra os metadados do banco. No caso, ela lista todas as constraints r...

Uso de memória no SQL Server

O SQL Server, por padrão, tenta colocar o máximo possível de páginas na memória RAM. Esse comportamento é padrão do SQL Server e é o esperado. Isso serve para assegurar o menor tempo de resposta possível na consulta. Logicamente esse comportamento pode ser limitado. Podemos configurar o máximo de memória que o SQL Server pode consumir com paginação, deixando uma margem para outros serviços, no entanto isso não é recomendado pela Microsoft. A recomendação é que o SQL Server seja um servidor dedicado. Recorri à documentação do SQL Server disponível no MSDN e outras fontes para fazer o performance tunning do servidor que eu administro e encontrei um artigo muito esclarecedor, gostaria de compartilhá-lo com vocês: http://www.brentozar.com/archive/2011/09/sysadmins-guide-microsoft-sql-server-memory/                 Resumindo:            ...

Diferença entre Log Shipping, Mirroring e Replication

Li alguns artigos sobre a diferença entre Log Shipping, Mirroring e Replication e gostaria de compartilhar. http://www.replicationanswers.com/ReplicationLogShippingMirroring.asp Difference between Log Shipping, Mirroring and Replication http://simplesql.blogspot.com.br/2011/01/replication-vs-mirroring-and-what-to.html Basicamente, o Log Shipping é uma estratégia só de Disaster Recovery, mas não muito eficiente para relatórios ou replicação/distribuição dos dados. Ele nada mais faz do que restaurar em uma outra base os logs de transação periodicamente. Esta base fica com lock exclusivo, então consultas nela só podem ser feitas usando-se nolock (dirty reads) ou isolation level snapshot. Log Shipping restaura o banco inteiro, inclusive tabelas de sistema, views, procedures etc. Mirroring também é uma solução para Disaster Recovery e funciona para o banco todo, inclusive dados de sistema. Sua vantagem é que pode ser configurado com failover automático, ou seja, para entrar no ar as...

Lentidão ao executar Delete

Estava executando uma procedure pra atualizar os relacionamentos entre projetos e funcionários do meu sistema e a procedure estava demorando mais de um minuto para executar. Abri o fonte da procedure e executei os comandos dela internamente, e todos eles demoravam menos de um segundo para executar, exceto um delete que demorava mais de um minuto.                 O comando delete from Projeto_Usuario estava demorando mais de um minuto para executar, mas apenas 7000 linhas não deveria demorar tudo isso. (isso causa timeout na maioria das aplicações porque o timeout default de um comando é 30 segundos, e o de uma conexão é de 15 segundos). O mais correto a se fazer não é aumentar esse timeout, e sim otimizar a query.                                 A t...

Fibonacci em SQL

Como prometi que minha próxima postagem seria sobre SQL, resolvi fazer a sequência de Fibonacci no SQL Server. O SQL Server e o Transact SQL permitem a criação de funcions, procedures ou mesmo queries com o uso de várias construções comuns em linguagens de programação, como while, if etc. A sequência de Fibonacci é um exercício muito comum de ser feito em cursos técnicos ou faculdades de áreas relacionadas à informática, e é um exercício clássico de programação. Para quem não sabe, a Sequência de Fibonacci  é uma sequência onde o próximo número sempre é a soma dos dois anteriores, partindo do 1, por exemplo: 1,1,2,3,5,8,13,21 O número de ouro, ou razão áurea, se dá pela divisão de dois termos vizinhos da sequência de Fibonacci, como por exemplo 13/5. Esse número, representado pela letra grega Φ (phi) é de grande importância na matemática e na biologia, já que indica a proporção em que se dá o crescimento biológico. Várias partes de nosso corpo (e de outras espécies) seguem ...

Formatando datas no SQL e no C#

Muitas vezes é necessário exibir datas em um determinado formato no GridView. Muitos programadores convertem a data para o formato desejado já na consulta SQL ou procedure. Isso não está correto por uma série de motivos, entre os quais podemos citar: 1) A responsabilidade de formatar a data deve ser totalmente da view, ou seja, da camada de apresentação. 2) Datas formatadas pelo SQL não são mais datas, são varchars, e não podem ser ordenados como datas. 3) Trazendo sempre a data integral do banco de dados pode-se fazer qualquer operação desejada com ela. Veja o link abaixo para tirar qualquer dúvida que você possa ter a respeito. http://weblogs.sqlteam.com/jeffs/archive/2007/04/13/format-date-sql-server.aspx Dito isso, algumas considerações interessantes: Para formatar strings diretamente em uma GridView adicione a coluna (bound column) e defina um valor para a propriedade DataFormatString: <asp:BoundField DataField="Data" DataFormatString="{0:dd/MM/yyyy...