quarta-feira, 24 de setembro de 2014

Dicas para passar na certificação 70-461: Querying Microsoft SQL Server 2012

Já fazem alguns dias que não público nada no blog. Então, aproveitando que alguns amigos tem me perguntado dicas para passar na certificação 70-461: Querying Microsoft SQL Server 2012, resolvi fazer esse post. Seguem algumas dicas para estudar nessa certificação SQL Server:

Primeiro entenda e saiba todas as habilidades que serão medidas. Se você passar em uma das provas abaixo você será um MCP e se passar nas três poderá ser um MCSE: Data Platform.

Pelo que eu percebi no site do MCP, também é possível conquistar o título MCSE se passar em outras certificações, como por exemplo 70-483: C# Specialist. Mas não tenho certeza sobre isso...

Como/Onde estudar?
Minha recomendação é que você baixe o manual do SQL Server, usando o próprio Management Studio. Se surgir alguma dúvida de como fazer isso, pode mandar um e-mail para aenportao@gmail.com que eu explico...

Planeje seus estudos...
Outro ponto importante é você ter foco e determinação. Para isso, crie uma agenda com os dias que você pode estudar e também para cada dia qual a meta que você tem que alcançar. Por exemplo, amanhã vou estudar o CREATE VIEW, depois CREATE SEQUENCE.
Faça uma meta pessoal que você possa alcançar para não ficar sob pressão ou decepcionado com você mesmo se não alcança-la. Alguns tópicos do estudo vão se estender mais que um turno, por exemplo CREATE TABLE.

O que estudar?
Todo o conteúdo descrito aqui está no manual do SQL Server. Basicamente o conteúdo que você deve estar dominando é:

DDL
   CREATE
      TABLE (focar muito nesse!)
      VIEW
      PROCEDURE
      FUNCTION
      TRIGGER
      SEQUENCE
      INDEX
   ALTER
      TODOS OS ANTERIORES +
      SCHEMA
   DROP
      TODOS ANTERIORES
   DISABLE/ENABLE
   TRUNCATE x DROP x DELETE
TIPOS DE DADOS (entender as diferenças entre cada)
DML
   SELECT
      SUBCONSULTAS
      HINTS (nolock, updlock, etc)
      TOP (com PERCENT / WITH TIES)
      JOINS (INNER, LEFT, RIGHT, FULL, CROSS, OUTER APPLY)
      OPERADORES DE CONJUNTO (UNION ALL, UNION, EXCEPT, INTERSECT, precedências)
      GROUP BY
      CUBE
      ROLLUP
      GROUPING_SETS
   INSERT
      Com values
      Com as select
      Com output
   UPDATE
   DELETE

   MERGE   WRITE (noção básica do que faz)
FUNÇÕES DE SISTEMA (Todas!!!)
PREDICADOS (noção básica)
RAISE ERROR x THROW
Comandos SET
EXECUTE
DBCC
XML

   ROW
   AUTO
   PATH
   EXCEPT
   Com/Sem ELEMENTS
NÍVEL DE ISOLAMENTO DE TRANSAÇÕES
CURSORES
    Estudar todos os tipos (FAST_FORWAD, FORWARD_ONLY, KEYSET, DYNAMIC, STATIC, etc). Precisa ter pelo menos uma noção básica de cada um.





Banco de Dados - AdventureWorks2012
Para os estudos será necessário ter a base usada no Help do SQL Server. Sendo assim, baixe a base no link: http://msftdbprodsamples.codeplex.com/releases/view/55330

Simulados
Antes de comprar ou iniciar os simulados estude todo o conteúdo acima. Porque? Dois motivos simples: tu vai "perder" tempo respondendo as questões sem ter estudado e vai "queimar" cartuchos, pois quando for fazer o simulado mesmo, depois de ter estudado tu já ter lembrança das questões... ;)

Outra dica é comprar um simulado no MeasurUp, pois possui questões mais atualizadas com a prova. Apesar de ser em inglês, ajuda bastante a se preparar para o dia da prova.

Meus amigos, espero que isso possa ajudar! Vou ficar muito lisonjeado se minhas dicas fizerem alguém conquistar esse objetivo!

Muito em breve quero preparar um post com dicas para passar na OCE, Oracle Database Expert 11g.

quinta-feira, 7 de março de 2013

Ultimamente o tempo anda curto...

Já faz bastante tempo que não tenho feito postagens no blog. Peço desculpas, mas o tempo realmente anda cada dia mais curto. ;)

Hoje gostaria apenas de publicar algumas fotos do último projeto que tive o grande prazer de atuar como analista de sistemas, o Comitê Paralimpico Brasileiro...

Fazendo propaganda para o CPB... ;)
Feliz com andamento do projeto...

Essa é a vista maravilhosa da sala utilizada para o projeto.

Queria agradecer a toda a equipe da CIGAM que tem me ensinado bastante, entre eles Vagner, Vera, Gabriel, Alexandre, Rafael Zorzanello, Thomas, e todos os demais colegas. Não poderia também deixar de agradecer a equipe do CPB que é fantástica, com relacionamento agradabilíssimo. Só tenho a agradecer!

Valeu pessoal! Esse ano prometo postar mais assuntos interessantes...


domingo, 29 de janeiro de 2012

Procedure para gerar sequencial numérico e/ou alfabético

Pessoal, sei que já faz bastante tempo que não posto alguma novidade no blog. Mas hoje vou compartilhar uma procedure que pode ser útil para geração de sequenciais que deve-se considerar caracteres numéricos e do alfabeto (0-9, A-Z e a-z).

Um exemplo de utilidade, seria gerar uma faixa assim: A01 - A10. Essa procedure lhe retornará A01, A02, A03, A04, A05, A06, A07, A08, A09 e A10, por exemplo.

Vamos ao código fonte da nossa procedure então... os comentários existentes na procedure explicam a lógica e as validações existentes...

create or replace procedure PR_GERASEQUENCIALNS(p_seqIni varchar2,
                                                      p_seqFin varchar2,
                                                      p_considerarAlpha number) is

   v_seqIni varchar2(50);
   v_seqFin varchar2(50);
   v_considerarAlpha boolean;
   v_somaNumericosIni number;
   v_somaNumericosFin number;
begin
   --atualiza variáveis virtuais...
   v_seqIni := p_seqIni;
   v_seqFin := p_seqFin;
   if p_considerarAlpha = 1 then
      v_considerarAlpha := true;
   else 
      v_considerarAlpha := false;
   end if;
   
   --preenche com zeros a frente os sequenciais para terem o mesmo tamanho...
   if length(v_seqIni) > length(v_seqFin) then
      v_seqFin := lpad(v_seqFin, length(v_seqFin), '0');
   elsif length(v_seqIni) < length(v_seqFin) then
      v_seqIni := lpad(v_seqIni, length(v_seqIni), '0');
   end if;
   
   --avalia as restrições dos parâmetros para prosseguir...
   --primeira restriçäo: o posicionamento dos caracteres deve ser identico, ou seja, um maisculo deve corresponder ao maisculo.
   --segunda restrição: também deve-se levar em consideração que se o parâmetro p_considerarAlpha for 0 e for enviado A98 - B01, por exemplo, nenhum 
   --sequencial será impresso, pois 
   for i in 1 .. length(v_seqFin) loop
      --avalia se a sequencia inicial pertence a faixa de númericos da tabela ASCII e os sequencial final não..
      if ascii(substr(v_seqIni, i, 1)) between 48 and 57 and ascii(substr(v_seqFin, i, 1)) not between 48 and 57 then
         raise_application_error(-20001,'Existe inconsistência entre os caracteres da posição '||i||'. Reavalie os sequenciais.');   
      --avalia se a sequencia inicial pertence a faixa de alfabeticos maiscula da tabela ASCII e os sequencial final não..         
      elsif v_considerarAlpha and ascii(substr(v_seqIni, i, 1)) between 65 and 90 and ascii(substr(v_seqFin, i, 1)) not between 65 and 90 then
         raise_application_error(-20001,'Existe inconsistência entre os caracteres da posição '||i||'. Reavalie os sequenciais.');
      --avalia se a sequencia inicial pertence a faixa de alfabeticos minusculos da tabela ASCII e os sequencial final não..         
      elsif v_considerarAlpha and ascii(substr(v_seqIni, i, 1)) between 97 and 122 and ascii(substr(v_seqFin, i, 1)) not between 97 and 122 then
         raise_application_error(-20001,'Existe inconsistência entre os caracteres da posição '||i||'. Reavalie os sequenciais.');
      elsif not(v_considerarAlpha) and ascii(substr(v_seqIni, i, 1)) between 48 and 57 then
         v_somaNumericosIni := ascii(substr(v_seqIni, i, 1));
         v_somaNumericosFin := ascii(substr(v_seqFin, i, 1));
      end if;
   end loop;
   
   if not(v_considerarAlpha) and v_somaNumericosIni > v_somaNumericosFin then
      raise_application_error(-20001,'A sequencia inicial é maior que a final. Faça uma reavaliação.');
   end if;

   --gera o sequencial de numeros de série...
   for i in 1 .. length(v_seqFin) loop
      if (not(v_considerarAlpha) and ascii(substr(v_seqIni, i, 1)) between 48 and 57) or v_considerarAlpha then
         while ascii(substr(v_seqIni, i, 1)) < ascii(substr(v_seqFin, i, 1)) loop
               dbms_output.put_line(v_seqIni);
      
               v_seqIni := FC_INCSERIAL(v_seqIni);
         end loop;
      end if;
   end loop;
   
   dbms_output.put_line(v_seqFin);
end;

Como todos podem ver, para compilar a procedure com êxito, será necessário ter a função FC_INCSERIAL. Então vou compartilhá-la ela em seguida...

create or replace function FC_INCSERIAL(p_seq varchar2,
                                        p_posicao number default 0) return varchar2 is
  r_seq varchar2(50);
  v_posicao number default p_posicao;
  v_asciiCorrente number;
begin
  --tratamento para a posição...
  if v_posicao = 0 then
     v_posicao := length(p_seq);
  end if;
  
  --tratamento para o ascii
  v_asciiCorrente := ascii(substr(p_seq,v_posicao,1));
  
  --tratamento para caracteres númericos...
  if v_asciiCorrente between 48 and 57 then
     if v_asciiCorrente = 57 then
        r_seq := FC_INCSERIAL(substr(p_seq,0,v_posicao-1),v_posicao-1);
        r_seq := r_seq||chr(48);
     else
        r_seq := substr(p_seq,0,v_posicao-1)||chr(v_asciiCorrente+1);
     end if;
  --tratamento para caracteres alfabeticos maiusculos...     
  elsif v_asciiCorrente between 65 and 90 then
     if v_asciiCorrente = 57 then
        r_seq := FC_INCSERIAL(substr(p_seq,0,v_posicao-1),v_posicao-1);
        r_seq := r_seq||chr(65);
     else
        r_seq := substr(p_seq,0,v_posicao-1)||chr(v_asciiCorrente+1);
     end if;
  --tratamento para caracteres alfabeticos minusculos...     
  elsif v_asciiCorrente between 97 and 122 then
     if v_asciiCorrente = 57 then
        r_seq := FC_INCSERIAL(substr(p_seq,0,v_posicao-1),v_posicao-1);
        r_seq := r_seq||chr(97);
     else
        r_seq := substr(p_seq,0,v_posicao-1)||chr(v_asciiCorrente+1);
     end if;
  end if;
  
  return(r_seq);
end FC_INCSERIAL;

O que torna esse código efetivo é a função recursiva. Outro detalhe que acredito que seja interessante é a lógica de utilizar a tabela ASCII para fazer o incremento de numéricos e alfabéticos.

Um exemplo de chamada para ela seria assim...

begin
  PR_GERASEQUENCIALNS('A90','B05',1);
end;

O resultado da execução desse exemplo, resultaria no seguinte output:

A90
A91
A92
A93
A94
A95
A96
A97
A98
A99
B00
B01
B02
B03
B04
B05

Bom pessoal, por hoje é isso... espero que gostem desse pequeno post...

quarta-feira, 6 de julho de 2011

Diagrama ER do dicionário de dados do MSSQL

Hoje estou passando aqui no blog bem rápido, só pra compartilhar com vocês um diagrama entidade relacionamento que precisei nos últimos dias e demorei um pouquinho para encontrar. É o diagrama ER dos objetos internos do banco MSSQL 2005.

Segue o link dele: http://bit.ly/rkzAYZ

Valeu pessoal!

sexta-feira, 13 de maio de 2011

Função para contar palavra

Gostaria de compartilhar com vocês um problema que tive de resolver a pouco tempo em um script SQL (que logo estarei postando para vocês esse script).

Enfim, meu problema era que precisava saber quantas vezes um determinado termo ou caracter aparecia em uma String. Precisava resolver esse problema através de uma função... por isso, segue abaixo um exemplo de solução:

 create function fc_conta_palavra(@palavra varchar(100),  
                                     @string varchar(max))  
 returns int  
 as  
 begin  
    -- declaração variáveis usadas na função  
    declare @contador int, @contadorpalavra int  
   
    --contador de quantas vezes apareceu a palavra  
    set @contadorPalavra = 0  
   
    --contador do loop  
    set @contador = 0  
   
    -- loop  
    while @contador <= len(@string)  
    begin  
   
       --se encontrar a palavra soma mais um para @contadorPalavra  
       set @contadorPalavra =  
          case when substring(@string, @contador, len(@palavra)) = @palavra  
             then @contadorPalavra + 1  
             else @contadorPalavra  
          end  
   
       --soma mais um ao contador do laço while  
       set @contador = @contador + 1  
   
    end  
   
    -- retorna valor  
    return @contadorPalavra  
 end  

Se alguém souber como resolver usando funções nativas do SQL Server, por favor, comentem a solução nesse post.

Bom, espero que tenham gostado!