Articles tagged with: TSQL

Área de Scripts

Nova seção de scripts!

Bom dia,

A partir de hoje, vou postar alguns scripts de uso pessoal por dois motivos:

1) Talvez ajude alguém;

2) Abandonar a preguiça de usar o blog;

A categoria SCRIPTS na parte superior do blog  também será atualizada conforme as postagens!

 

SQL Server 2012 – Logical Functions e mais economia de código

logic

Boa noite 🙂

Outro post básico e rápido sobre funções lógicas (do mesmo grupo das já conhecidas estruturas lógicas, que envolvem WHILE, IF, CASE)…

Duas agradáveis adições foram realizadas no SQL Server 2012. Duas funções lógicas que já são velhas conhecidas para quem já programa(ou): IIF e CHOOSE.

IIF

(Documentação Oficial na MSDN para maior apronfudamento)

Também conhecido como IF ternário, nada mais, no contexto de algumas linguagens de programação, uma forma mais organizada de se fazer realizar uma escolha condicional entre dois valores utilizando uma expressão.

Estrutura:

IIF (boolean_expression, true_value, false_value) ou em bom português IIF (expressão_booleana, valorSeVerdadeiro, valorSeFalso)

É justamente pela estrutura que vem o nome de IF Ternário, por possui três elementos (parâmetros) em sua condição.

Seguem três exemplos pra posteriores comentários.

Em suma, como IF não pode ser utilizado em comandos SELECT deliberadamente para realizar condições, sendo utilizado mais em Stored Procedures e Funções, IIF serve como sintaxe alternativa para a função CASE, que faz exatamente o que a instrução IIF faria em uma instrução SELECT.  O que acho bacana nesse comando:

  • Sintaxe simples, limpa e direta (embora de começo pareça complexa);
  • Segue padrões .net (ao trabalhar com Integration Services, por exemplo, é uma cláusula largamente utilizada para faze comparações) e de outras linguagens;
  •  Economia de código, facilitando legibilidade;

Tem só um pequeno detalhe… Não estou dizendo que é um substituto pra CASE, por um simples e humilde motivo, e lógico ainda por cima:

CASE, assim como IF (em seu devido lugar) permitem mais de duas expressões lógicas. IIF é X, se não for X, ah meu amigo, é Y. Sem choro nem vela.

Códigos para expressar o sentimento:

Logo, é necessário avaliar qual a melhor construção para a sua lógica.

CHOOSE

Documentação Inicial na MSDN

Resumindo, assim como o IIF, o CHOOSE é outra cláusula condicional que pode, dependendo do caso, substituir o CASE. É mais uma construção bastante utilizada em .net e inclusive no Integration Services (Olha a MS casando particularidades de produtos “distintos” da suite  do SQL Server aos poucos aí!)

Vamos falar antes de sua construção:

A função CHOOSE vai retornar exatamente o valor que corresponde ao index passado no primeiro parâmetro:

O protocolo é claro. Existem cinco parâmetros dentro do CHOOSE. O primeiro vale um (1) e o último cinco (5). O número (index) passado é Quatro (4) então ele vai buscar o quarto valor nos parâmetros. No segundo exemplo, como ele não acha o parâmetro cujo valor é sete (7) ele simplesmente retorna NULO. A mesma coisa vale para o ZERO.
Outra aplicação prática:

But, contudo, todavia, todos os parâmetros devem ser do mesmo tipo, pois caso um dos valores esteja fora do padrão, ocorrerá um erro na execução. Veja só:

(6 row(s) affected)
Msg 245, Level 16, State 1, Line 7
Conversion failed when converting the varchar value ‘DOMINGO’ to data type int.

Enfim, alguns pontos positivos:

  • As mesmas vantagens do IIF

Minha única observação sobre a função é que poderia ser MUITO, mas MUITO útil caso fosse possível utilizar intervalos de valores, como é possível com CASE (usando BETWEEN por exemplo) e outras possibilidades lógicas. Acho o comando um pouco limitado no geral assim como o IIF. Mas tem quem gostará, com certeza. Qual a melhor escolha? A resposta pra praticamente qualquer coisa no SQL Server é: It’s depends.

Espero ter sido claro e ter ajudado alguém. Se sim, Já valeu a postagem.

Obrigado pela visita and…

Keep Querying !

[]’s

Desafio #2 T-SQL – MERGE e OUTPUT

Merge

MERGE é uma cláusula sensacional que foi implementada no SQL Server 2008. Pouca gente usa, e eu imagino que seja pela complexidade de declaração se comparando com outros comandos DML (Como por exemplo, DELETE, UPDATE e INSERT).

Leia mais sobre o comando aqui

Devo lembrar que a prova 70-461 vai cobrar esse conhecimento e provavelmente em mais de uma questão (assim como aconteceu na 70-433) e é bastante interessante que o conhecimento da mesma seja algo natural e intuitivo, além de ser um ótimo modo de se pensar/programar DML. Qual a forma que encontrei falar sobre a cláusula? Bem, claro, com um desafio! Vamos ao Desafio T-SQL #2 – MERGE e OUTPUT

Case

A empresa Trupe123 resolve, depois de anos sem dar aumento para seus funcionários, tomar uma atitude. Muito foi discutido sobre plano de crescimento, meritocracia, etc e depois de muita discussão, polêmica e briga. Como várias pessoas também saíram da empresa em um curto período de tempo, o RH aproveitou o momento para realizar mudanças no quadro de funcionários (acrescentando e/ou retirando profissionais) ou alterando cargos.O responsável pelo RH, chamado Pedro Bial entregou a você, o DBA, uma lista de mudanças que devem ser refletidas na tabela de empregados.

Com o material necessário pronto para fazer o seu trabalho, algumas instruções lhe são impostas: O pedido do RH foi bastante claro: associar pelo nome que já existe no sistema.

1) Quem estiver com ativo = 0, foi desligado. Logo, deve-se apagar da tabela de Empregados quem foi desligado.

2) O Profissional que estiver na lista de Mudanças do RH mas não estiver na tabela de Empregados deve ser incluído.

3) Pode ter havido alguma alteração de cargo para quem não foi desligado. O valor que deve permanecer é o que vem da lista de Mudanças do RH, desde que o funcionário exista tanto na tabela como na Lista do RH.

4) O profissional que estiver na tabela de Empregados mas não estiver na Lista de Mudanças deve ser mantido como está.

Agora, como dizia Bane: LET THE GAMES BEGIN! O desafio, composto de duas etapas:

1) Construa uma instrução MERGE que esteja dentro do pedido do Pedro Bial, do RH;

2) Construa uma tabela de auditoria temporária que irá receber:

a) O nome do funcionário envolvido na atualização;

b) O nome do evento (INCLUSÃO, EXCLUSÃO OU ATUALIZAÇÃO) seguido do valor antigo e do valor novo, se necessário;

c) Um campo de DATA que informe DATA E HORÁRIO de quando o registro foi incluído na tabela de auditoria; PS: Para o desafio de no.2, sinta-se a vontade para recriar toda a estrutura e adapte a sua estrutura MERGE utilizando a cláusula OUTPUT.

Outra coisa: como você provavelmente vai testar bastante tais comandos, vale a pena abrir algumas transações e ver o resultado por lá mesmo. É isso. Na próxima postagem volto com o resultado. Provavelmente final de semana. Novamente, obrigado pela sua visita e sinta-se a vontade.