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
sexta-feira, 8 de outubro de 2010
terça-feira, 5 de outubro de 2010
Service Pack 2 SP2 do SQL Server 2008 está disponível para download
A Microsoft disponibilizou a versão final do Service Pack 2 (SP2) para download em: http://www.microsoft.com/downloads/details.aspx?FamilyID=8fbfc1de-d25e-4790-88b5-7dda1f1d4e17&displayLang=pt-br, uma das alterações nesta versão é a integração do Reporting Services com o Sharepint 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.
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
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.
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:
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.
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 |
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
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:
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:
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.
Como exemplo:
| TABELA FUNCIONARIO | ||
| ID | NOME | DT_NASC |
| 1 | João | 25/12/1980 |
| 2 | Maria | 04/04/1987 |
| 3 | Paulo | 29/09/1984 |
| TABELA DEPENDENTE | |||
| DEP_ID | FUNC_ID | NOME | RELACAO |
| 1 | 1 | Ana Maria | Conjuge |
| 2 | 1 | Ana Paula | Filho(a) |
| 3 | 1 | João Jr | Filho(a) |
| 4 | 2 | Carlos | Conjuge |
| 5 | 3 | Pedro | Filho(a) |
| 6 | 3 | Julia | Filho(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ÁRIO | LISTA DE FILHOS(AS) |
| João | Ana Paula, João Jr |
| Maria | |
| Paulo | Pedro, 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.
Assinar:
Postagens (Atom)
