SQL 2005 – ROW_NUMBER()

 

Existem algumas coisas que não sabemos da existência, outras até conhecemos mas não temos idéia do dia que precisaremos delas. 

Há uns quatro anos eu precisava realizar uma consulta e retornar uma coluna com um seqüencial, numerando as linhas, algo bem simples assim:

 

cod_produto    des_produto                    sequencial

————– —————————— ————-

516E           Arroz                              1

03G            Azeitona                           2

98K            Salame                             3

514A           Tomate                             4

 

Como retornar um sequencial num comando Select simples? Eu não queria usar cursor, nem uma tabela auxiliar, nada disso, queria apenas um seqüencial, simples e objetivo. Enfim, procurei diversos meios e até hoje não soube uma forma simples de fazer isso no SQL Server 2000.

Com o SQL Server 2005 aquele bordão “Seus problemas acabaram” cabe perfeitamente nesse cenário. Existe uma função Row_Number() que  faz exatamente isso. Veja um exemplo:

 

SELECT

      cod_produto,

      des_produto,

      ROW_NUMBER() over (order by des_produto) sequencial

FROM

      tb_teste_produto

 

Como fica subtendido a consulta SQL irá retornar os campos da tabela mais um campo  seqüencial baseado na ordenação do nome do produto.

 

Simples não é?

 

Trabalhando com subconsultas é possível por exemplo atualizar todos os registros entre as linhas 60 e 80 de uma consulta…

 

é o T-SQL dando asas a nossa criatividade!

 

 

Se você tem outra solução para este cenário contribua deixando seu comentário 🙂

 

 

Bla bla bla

E ae pessoas,

Essa semana será bem diferente, estamos trabalhando num projeto onde o cliente quer migrar seu banco do SQL Server para Oracle… justamente o contrário daquilo que eu estou acostumado. Apanhei bastante para configurar os famosos .ora do oracle, aproveitei o ensejo e no fim de semana li e assisti uns webcasts sobre Oracle… se o projeto vingar vou ter que mergulhar de cabeça nisso…

Creio que isso vem pra somar e vamos lá, aprender Oracle na marra… risos

Vai ser bem divertido :)))

Profissões TOP 20

Tava navegando na net agora e encontrei um artigo bacana falando sobre profissões que não devem sofrer com a recessão da economia mundial. Dei uma resumida no assunto, vejam que estamos na lista 🙂

Segundo a JobFOX, abaixo estão as profissões à prova de recessão na economia. Seis funções de TI fazem parte do ranking:

1° – Executivo de vendas e desenvolvimento de negócios

2° – Engenheiro/projetista de software

3° – Enfermeiros

4° – Executivos de finanças e contabilidade

5° – Contadores

6° – Administrador de redes e sistemas

7° – Assistentes administrativos

8° – Analistas de implementação de software em empresas

9° – Analistas de pesquisas em negócios

10° – Profissionais de finanças

11° – Gerentes de projetos

12° – Especialistas em testes e controle de qualidade

13° – Gerentes de produtos

14° – Administradores de bancos de dados

15° – Gerentes de contas e atendimento a clientes

16° – Executivo de tecnologia

17° – Engenheiro elétrico

18° – Executivo de vendas

19° – Engenheiro mecânico

20° – Gerente de contratos com a área governamental

A matéria completa pode ser vista aqui.

Té +

Novidades – Certificação SQL Server

Essa semana tá uma correria aqui mas pra não passar em branco posto abaixo um link com novidades sobre certificações Microsoft, em especial, para o SQL Server.

O post é do meu amigo Salvador Scardua e você pode conferir clicando aqui.

Um bom fim de semana a todos 🙂

SQL Server 2008 – Está chegando!

 

Depois de dois anos e meio de muito trabalho, em Agosto o SQL Server 2008 entra para a tabela de preços da Microsoft, isso significa que em menos de um mês teremos oficialmente a nova versão do SQL Server.

Pra você que está curioso e que dar uma olhada no que está vindo por aí, o release 0 está disponível aqui, depois deste release, somente o oficial. Esta versão tem validade de 180 dias.

Até +

Webcast

 

 

Hoje apenas uma dica:

 

Algumas pessoas não conhecem, e outras já ouviram falar mas não usufruem, as vezes por falta de tempo, outras por dificuldades com idioma e etc… minha intenção é clarear um pouco esse assunto: Webcasts.

 

Pra quem não sabe, webcast é algo parecido com uma palestra ou uma vídeo-aula que você pode assistir em tempo-real (ao vivo) através da internet, ou baixar o conteúdo para assistir depois (por demanda). Assistindo ao vivo você tem a opção de interagir com a turma e enviar perguntas/comentários em tempo real. Os palestrantes são profissionais com bastante experiência e os assuntos são os mais diversos, sempre focados nas ferramentas da Microsoft.

 

Existem webcasts em inglês e português (no fim deste post estão os endereços) e os mesmos tratam de diversos assuntos… por exemplo, você sabia que existe uma versão compacta do SQL Server? Não estou falando da MSDE/Express, mas sim da SQL Server Compact… pois é, existe um webcast falando sobre isso, em português, com duração de 60 minutos, que você pode conferir agora clicando aqui.

 

Lembro que quando comecei a estudar informática (e isso não faz tanto tempo assim) livros eram escassos e muito caros e nas bibliotecas públicas você só encontrava livros antigos (isso não mudou muito, risos). Fico satisfeito ao ver que em menos de 10 anos esse cenário mudou completamente e a Internet deu às pessoas a democratização da informação de uma forma muito rica.

 

Abaixo os links:

 

http://msevents.microsoft.com/CUI/default.aspx?culture=pt-BR (Português)

http://msevents.microsoft.com/CUI/default.aspx?culture=en-us (Inglês)

 

Uma ótima semana!

MSDE – Restaurar backup maior que 2 GB

(Essa é para os workaholics)

 

Chega sexta feira, você pega o backup da base de dados do serviço e leva pra casa pra adiantar o trabalho (ou correr atrás do prejuízo). Aí no sabadão, ao tentar restaurar o backup: ERRO.

Tenta o restore de novo e o mesmo erro. Sacanagem…

Então liga pra um amigo, pesquisa no Google e descobre: o MSDE tem uma limitação, não aceita bases de dados maiores que 2 GB!!

 

Ok, como (quase) tudo na vida, existe um “jeitinho” pra resolver isso, mas sinceramente não sugiro esse procedimento em nenhum ambiente de produção/homologação e etc. Repito: não sugiro esse procedimento em nenhum ambiente de produção/homologação e etc.

 

Para utilizar uma base > 2GB no MSDE você vai precisar dos arquivos MDF e LDF da sua base de dados original (a do seu trabalho). O procedimento é simples, mas tem contratempos, porque para copiar esses arquivos a base deve estar “desatachada” (ficou estranho mas não encontrei um termo mais apropriado) ou o serviço do SQL deve estar parado. Escolha uma das duas opções e copie os arquivos.

 

Na sua casa o procedimento vai ser o seguinte.

 

1 – No MSDE crie uma base de dados com o mesmo nome que ela tem em seu trabalho;

2 – Verifique onde os arquivos físicos da base foram criados;

3 – Pare o serviço do SQL Server;

4 – Pegue os arquivos MDF e LDF de seu serviço e cole (substitua!) os arquivos que o SQL acabou de criar para a sua nova base (é muito importante que os arquivos tenham o mesmo nome!);

5 – Inicie o serviço do SQL Server e …

 

Bom trabalho!

SQL Server – Executar DTS via código

Uma dúvida muito comum:

Como executar um pacote DTS via código?

Muito simples… podemos a partir do DOS digitar o seguinte comando:

dtsrun /S nome_servidor /E /N nome_do_pacote

 

O pacote será executado.

Aí me perguntam: Ah, mas eu quero executar a partir do SQL Server!

Ok, existe a opção de utilizar a procedure xp_cmdshell para executar o mesmo comando. Ficaria mais ou menos assim:

EXEC master..xp_cmdshell ‘dtsrun /S nome_servidor /E /N nome_do_pacote’

Porém é bom deixar um alerta: Essa procedure só pode ser executada por sysadmins, e no SQL Server 2005 ela vem desabilitada, (se você quiser utilizá-la deverá realizar isso na SQL Server Surface Area). Isso tudo por razões de segurança, afinal ela tem o poder de executar comandos no sistema operacional… tire suas próprias conclusões sobre isso e pense se é viável habilitá-la em seu ambiente.

Pra finalizar, segue abaixo alguns parâmetros que podem ser interessantes na utilização do comando dtsrun:

  • Executar comando utilizando login do Windows:
    /E  (Conexão confiável)
  • Executar comando utilizando login do SQL:
    /U login /P senha
  • Se o pacote tiver uma senha:
    /M senha

Para ter acesso a uma relação completa digite apenas dtsrun no prompt do DOS e Enter ou acesse este link: http://msdn.microsoft.com/en-us/library/aa224467(SQL.80).aspx.

Até +

Macro no Excel, coisas da rotina

 

É inevitável na rotina de um DBA ter que utilizar-se de ferramentas que auxiliem seu trabalho.

Ontem recebi uma planilha no seguinte formato:

SETOR SubSetor Regra Subregra Código Descrição
1 01.1       Bla bla bla
    01.11     Bla bla la
      01.11-3   Bla bla bla
        0111-3/01 Bla bla bla
        0111-3/02 Bla bla bla
        0111-3/03 Bla bla bla
        0111-3/99 Bla bla bla

Eu deveria importar esta planilha numa tabela de nosso banco. Dentro da tabela ela ficaria mais ou menos assim:

SETOR SubSetor Regra Subregra Código Descrição
1 01.1 NULL NULL NULL Bla bla bla
1 01.1 01.11 NULL NULL Bla bla bla
1 01.1 01.11 01.11-3 NULL Bla bla bla
1 01.1 01.11 01.11-3 0111-3/01 Bla bla bla
1 01.1 01.11 01.11-3 0111-3/02 Bla bla bla
1 01.1 01.11 01.11-3 0111-3/03 Bla bla bla
1 01.1 01.11 01.11-3 0111-3/99 Bla bla bla

Ok… existe uma hierarquia que visualmente fica melhor representada na primeira tabela, no entanto, dentro do banco os dados deveriam estar como exposto na segunda tabela, isso iria influenciar na chave primária e etc.

Enfim, vamos lá!

Mas faltou um detalhe… a tabela tinha algumas milhares de linhas. Como eu faria isso? CTRL C, CTRL V?? Quantas horas de um trabalho monótono copiando e colando, copiando e colando…

Bha!

Nessas horas eu adoro o Excel e suas macros. Para muitos pode parecer ridiculo mas me ajuda e talvez possa ajudar outras pessoas em situação parecida.

Ok… fiz um pequeno script que varria todas as linhas de uma determinada coluna da planilha, verificando se existiam células vazias. Se a célula está vazia, esta deve receber o conteúdo da célula anterior e assim por diante até o fim.

Muito simples e o trabalho todo, incluindo a importação no banco, não durou 1 hora. Então segue aí o script em VB, escrito dentro do próprio Excel:

Sub Copia_Celula_Anterior()

‘ Copia_Celula_Anterior() Macro
‘ Macro gravada em 1/7/2008 por silas.mendes

‘Declara váriavel de apoio do contador
Dim i As Integer

‘Inicializa váriavel com a primeira linha preenchida da planilha
‘ATENÇÃO: Esta informação sera copiada para outra(s) célula(s), caso
‘esteja(m) vazia(s).

i = 8

‘Varre todas a linhas da coluna até a linha 2371
Do While i < 2371
‘Verifica se a célula atual está vazia
If Range(“E” & i).Value = “” Then
‘Se a célula está vazia, seleciona a última célula
Range(“E” & i – 1).Select
‘Copia os dados da célula selecionada
Selection.Copy
‘Volta a selecionar a célula vazia (atual no loop)
Range(“E” & i).Select
‘Cola o conteúdo na célula vazia
ActiveSheet.Paste
End If
‘Incrementa contador do Loop
i = i + 1

Loop

End Sub

 

É, isso também faz parte da rotina de um DBA :))

T-SQL, Calculando a idade

 

O artigo abaixo foi escrito por Lynn Pettis para o site www.sqlservercentral.com. O texto original pode ser lido aqui.

 

Como calcular a idade de uma pessoa? Isto pode tornar-se um tema polêmico e com inúmeras soluções. Mas antes de criticar este tópico considere que ele pode ajudar a definir algumas regras a serem utilizadas na criação de um algoritmo que calcule a idade.

 

A parte mais difícil é saber o que fazer com os anos bissextos. Quando é que uma pessoa (objeto/documento) torna-se um ano mais velha? Neste pequeno artigo iremos definir que isto ocorre em 28 de fevereiro de anos não-bissextos.

 

Antes de mergulhar nos cálculos, vamos fazer alguns cálculos simples usando o SQL Server 2005.

 

Primeiro, vamos ver o que acontece quando adicionamos um ano às datas: 28/02/2008 e 29/02/2008:

 

declare @data1 datetime,

         @data2 datetime

set @data1 = ‘20080228’

set @data2 = ‘20080229’

select dateadd(yy, 1, @data1), dateadd(yy, 1, @data2)

 

Resultado:

 

2009-02-28 00:00:00.000  2009-02-28 00:00:00.000

 

Observem que adicionar um ano para ambas as datas, resultam na mesma data. Vamos ver então o que acontece quando adicionamos 4 anos:

 

declare @data1 datetime,

         @data2 datetime

 set @data1 = ‘20080228’

 set @data2 = ‘20080229’

 select dateadd(yy, 4, @data1), dateadd(yy, 4, @data2)

 

Resultado:

 

2012-02-28 00:00:00.000  2012-02-29 00:00:00.000

 

Veja que agora as datas são diferentes. Isto é o que esperávamos.

Agora vamos ver a função DATEDIFF e ver um pouco como ela trabalha:

 

declare @data datetime,

         @date2 datetime

 set @data = ‘20080229’

 set @date2 = ‘20090228’

 select datediff(yy, @data, @date2)

 

Resultado:

 

1

 

Ok, mas qual o resultado da próxima consulta?

 

declare @data1 datetime,

         @data2 datetime

 set @data1 = ‘20081231’

 set @data2 = ‘20090101’

 select datediff(yy, @data1, @data2)

 

Resultado:

 

1

 

Espere…Isso não está certo, não existe um ano de diferença entre essas datas, alguma coisa deve estar errada.

Como você pode ver a função DATEDIFF retornou o numero da diferença entre os anos e não o número real de anos entre as duas datas.

 

Nós podemos usar esta informação para criar um T-SQL simples:

 

declare @data_nascimento datetime,

        @idade int,

        @data_atual datetime

 

 set @data_atual = ‘2008-02-28’

 set @data_nascimento = ‘2007-03-01’

 set @idade = datediff(yy,@data_nascimento,@data_atual) case when @data_atual < dateadd(yy,datediff(yy,@data_nascimento,@data_atual), @data_nascimento) then 1 else 0 end

 

select @idade

 

 

 

 

 

Conclusão

 

Este é apenas um método para calcular a idade de uma pessoa. Existem outras inúmeras formas que podem ser usadas. Tudo o que posso sugerir é que você use o método que melhor lhe atenda em cada situação.