sexta-feira, 8 de outubro de 2010

Formatação de números com zeros à esquerda no SQL Server

Existem várias situações onde precisamos formatar números com zeros à esquerda para apresentar um uma consulta, para linhar e classificar corretamente um campo.

Considerando a seguinte tabela:

Create Table Teste (Codigo  int, Nome Varchar(40));

Insert into Teste Values(1,'José da Silva');
Insert into Teste Values(2,'Maria da Silva');
Insert into Teste Values(100,'Eusébio Queiroz');
Insert into Teste Values(1000,'Lucas Laranjeira');
Insert into Teste Values(200,'Judith Lima');


Se consultarmos da seguinte forma os dados:

Select Codigo, Cast(Codigo as Varchar(5)) 'CodigoAlfa', Nome
  From Teste
 Order By Cast(Codigo as Varchar(5));


Teremos o seguinte resultado:

Codigo    CodigoAlfa    Nome
1                          1        José da Silva
100                  100        Eusébio Queiroz
1000              1000        Lucas Laranjeira
2                          2        Maria da Silva
200                  200        Judith Lima

Observe que numericamente fica desordenado quando classificamos o número como varchar.
Para resolver esta situação altere a formatação do campo acrescentando os zeros à esquerda do número conforme a consulta:

Select Codigo, RIGHT('0000'+ CONVERT(VARCHAR,Codigo),5) 'CodigoAlfa', Nome
  From Teste
  Order By RIGHT('0000'+ CONVERT(VARCHAR,Codigo),5)

O resultado agora fica desta forma:

Codigo    CodigoAlfa    Nome
1                  00001        José da Silva
2                  00002        Maria da Silva
100              00100        Eusébio Queiroz
200              00200        Judith Lima
1000            01000        Lucas Laranjeira

terça-feira, 5 de outubro de 2010

segunda-feira, 27 de setembro de 2010

Como duplicar uma tabela no SQL Server

Para duplicar a estrutura e os dados de uma tabela no SQL Server, basta utilizar o operador INTO em um Select, por exemplo:

SELECT * INTO NOTASCOPIA
   FROM NOTAS

Será criada uma tabela NOTASCOPIA com os dados da tabela NOTAS e com os mesmos campos e definições.

quinta-feira, 23 de setembro de 2010

E-book Gratuito do SQL Server 2008 R2

No link a seguir tem como fazer o download de um e-book gratuito sobre o SQL Server 2008 R2, escrito por Ross Mistry e Stacia Misner.

Este livro mostra as principais novidades desta versão do SQL Server.

https://profile.microsoft.com/RegSysProfileCenter/wizard.aspx?wizid=bd9adb0f-cca3-4096-96f1-f834754d1b0b&lcid=1033

quinta-feira, 9 de setembro de 2010

Como carregar um arquivo texto para uma tabela no SQL Server

Umas das formas de carregar um arquivo texto para uma tabela no SQL Server é o utilitário bcp.
Para facilitar o entendimento, vou criar um exemplo de um arquivo com três campos delimitados por “;” que devem ser carregados em uma tabela que utilizará somente dois destes campos.

Definição da Tabela:

CREATE TABLE CONTAS
      (REDUZIDA VARCHAR(6),
       COMPLETA VARCHAR(12));

Arquivo exemplo:

000001;Conta Teste;100020003000
000002;Conta Despesas;200020003000
000003;Conta Salários;300020003000

Para fazer a importação vou gerar um arquivo onde é especificado o formato que o arquivo texto possui e onde cada campo deve ser importado. Para facilitar utilizaremos o bcp para gerar o arquivo a partir da tabela que irá receber os campos com a seguinte instrução:

bcp database.dbo.CONTAS format nul -T –n Contas.fmt –S Servidor\Instância –U usuário –P Senha

Altere “database.dbo” pelo banco de dados e o schema onde a tabela está definida.

Este comando irá gerar um arquivo com o seguinte conteúdo:

10.0
2
1 SQLCHAR 2 6 "" 1 REDUZIDA Latin1_General_CI_AS
2 SQLCHAR 2 35 "" 2 COMPLETA Latin1_General_CI_AS

Sendo a primeira linha a versão do banco de dados.
A segunda linha indica a quantidade de campos do arquivo.
A terceira e a quarta são as definições dos campos da tabela.
Neste exemplo vamos desprezar a descrição da conta para isto será inserido uma definicação de campo antes do campo “COMPLETA”, o arquivo ficará com o seguinte conteúdo:

10.0
3
1 SQLCHAR 0 6 ";" 1 REDUZIDA Latin1_General_CI_AS
2 SQLCHAR 0 35 ";" 0 DESPREZAR Latin1_General_CI_AS
3 SQLCHAR 0 35 "\r\n" 2 COMPLETA Latin1_General_CI_AS

Alterações realizadas:
  • Alterada a segunda linha para indicar que o arquivo tem três campos.
  • Incluída a definição do segundo campo e indicado que a posição dele na tabela é zero, ou seja não será importado.
  • Alterada a definição do campo COMPLETA para indicar que é o terceiro campo do arquivo, mantendo que ele está na segunda posição da tabela (sexta coluna do arquivo).
  • Incluído o delimitador de campos “;”, que no último campo é o final de linha do arquivo.


Figura 1
  
 Na figura 1 tem uma explicação do formato do arquivo retirado do manual do SQL Server.






Agora que temos o formato definido, abaixo está o comando que realiza a importação:

bcp database.dbo.CONTAS in arquivo.txt -f contas.fmt –U usuário –P senha –S servidor\instância

Este utilitário também serve para exportar os dados em arquivo texto.

Existem diversas outras opções tais como: pegar somente um pedaço do arquivo, outras formas de autenticação e utilizar arquivos de formato no padrão XML.

quarta-feira, 18 de agosto de 2010

Evento Discovery Informix Brasil - Agosto/2010

Semana que vem ocorrerá o Discovery Informix Brasil, evento que apresentará os recursos e as novidades deste banco de dados, e que contará com as presenças de:


Jerry Keesee - Director of Informix Database Development - ("o cara que faz o informix")
Stuart Litel - International Informix Users Group – President
Miguel Carbone - International Informix Users Group – Board of Directors

Agenda:

Dia 26/08/2010 - São Paulo
Dia 27/08/2010 - Rio de Janeiro
Dia 31/08/2010 - Belo Horizonte

Maiores detalhes em:

http://www.imartins.com.br/informix/artigos/evento-discovery-informix-sao-paulo-rio-janeio-belo-horizonte
http://informixbr.blogspot.com/2010/08/evento-informix-em-2608-nao-perca.html

sábado, 7 de agosto de 2010

Concatenar strings em registros diferentes - WM_Concat

Na sua empresa há uma tabela de Funcionários e outra de dependentes, conjuge, filhos, etc...) de cada funcionário. Há, portanto, duas tabelas: Funcionario( Func_ID, Nome, Dt_Nasc) e Dependente(Dep_ID, Func_ID, Nome, Relacao). É um tradicional relacionamento 1-N.

Como exemplo:

TABELA FUNCIONARIO
IDNOMEDT_NASC
1João25/12/1980
2Maria04/04/1987
3Paulo29/09/1984

TABELA DEPENDENTE
DEP_IDFUNC_IDNOMERELACAO
11Ana MariaConjuge
21Ana PaulaFilho(a)
31João JrFilho(a)
42CarlosConjuge
53PedroFilho(a)
63JuliaFilho(a)

Então, preparando uma festa de dia das crianças para os filhos do funcionário, alguém solicita um relatório com o nome do funcionário e o nome de todos seus filhos. Detalhe: todos em uma mesma coluna. Portanto, para atender à solicitação, teríamos:

RELATÓRIO DOS FILHOS
NOME DO FUNCIONÁRIOLISTA DE FILHOS(AS)
JoãoAna Paula, João Jr
Maria
PauloPedro, Julia

As tabelas de Funcionários e Dependentes podem ser criadas como views temporárias, apenas para uso nas queries de teste, pelo comando:

with funcionario as

(select 1 FUNC_ID, 'João' Nome, to_date('25/12/1980', 'dd/mm/yyyy') Dt_Nasc from dual union all
select 2 FUNC_ID, 'Maria' Nome, to_date('04/04/1987', 'dd/mm/yyyy') Dt_Nasc from dual union all
select 3 FUNC_ID, 'Paulo' Nome, to_date('29/09/1984', 'dd/mm/yyyy') Dt_Nasc from dual),
dependente as
(select 1 DEP_ID, 1 FUNC_ID, 'Ana Maria' Nome, 'Conjuge' Relacao from dual union all
select 2 DEP_ID, 1 FUNC_ID, 'Ana Paula' Nome, 'Filho(a)' Relacao from dual union all
select 3 DEP_ID, 1 FUNC_ID, 'João Jr' Nome, 'Filho(a)' Relacao from dual union all
select 4 DEP_ID, 2 FUNC_ID, 'Carlos' Nome, 'Conjuge' Relacao from dual union all
select 5 DEP_ID, 3 FUNC_ID, 'Pedro' Nome, 'Filho(a)' Relacao from dual union all
select 6 DEP_ID, 3 FUNC_ID, 'Julia' Nome, 'Filho(a)' Relacao from dual )


No Oracle há uma função não documentada, WM_CONCAT, que pode ser utilizada como uma função agregadora, da mesma forma que as habituais MAX, MIN, SUM e AVG. A query seria:

select f.nome, WM_CONCAT(d.nome)
  from funcionario f,
       dependente d
 where f.func_id = d.func_id
   and d.relacao = 'Filho(a)'
 group by f.nome;

Os valores são separados por vírgula. Caso seja necessário, a função REPLACE pode substituir a vírgula. eu usei para acrescentar um espaço após a vírgula, deste modo:

select f.nome, replace(WM_CONCAT(d.nome), ',', ', ')
  from funcionario f,
       dependente d
 where f.func_id = d.func_id
   and d.relacao = 'Filho(a)'
 group by f.nome;

Por último, uma palavra de precaução: como esta função não é documentada, a Oracle tem liberdade para numa próxima versão alterar o funcionamento ou simplesmente removê-la. Sendo assim, utilizá-la numa query para atender um demanda momentânea é seguro. Já utilizá-la em uma solução definitiva ou que deva rodar em várias versões de Oracle, é menos recomendável.