Abaixo um exemplo para separar o nome e o último sobrenome de um campo com o nome completo:
Select substring(nome,1,patindex('% %',nome)) 'Nome',
substring(nome,(len(nome) - (patindex('% %',reverse(nome))))+2,patindex('% %',reverse(nome)) ) 'Sobrenome'
From Funcionarios
quinta-feira, 6 de dezembro de 2012
sexta-feira, 17 de agosto de 2012
SQL Saturday 147
Falta uma semana para o SQL Saturday 147 em Recife - PE.
Todos que trabalham com SQL Server e tiverem condições, devem participar.
O evento é gratuito e os assuntos propostos são bastante relevantes para os profissionais da área.
No dia anterior 24/08/2012 ocorrerão mini-cursos e no dia 25/08/2012 as palestras do evento.
Vale a pena conferir.
Inscreva-se já (http://www.sqlsaturday.com/147/eventhome.aspx)
Abaixo palestras do dia 25/08/2012:
Todos que trabalham com SQL Server e tiverem condições, devem participar.
O evento é gratuito e os assuntos propostos são bastante relevantes para os profissionais da área.
No dia anterior 24/08/2012 ocorrerão mini-cursos e no dia 25/08/2012 as palestras do evento.
Vale a pena conferir.
Inscreva-se já (http://www.sqlsaturday.com/147/eventhome.aspx)
Abaixo palestras do dia 25/08/2012:
Start Time
|
Auditorium - Room: Auditorium
|
Lab 2 - Room: Lab 2
|
08:30 AM
|
||
09:00 AM
|
||
10:15 AM
|
||
11:30 AM
|
||
02:00 PM
|
||
03:15 PM
|
||
04:30 PM
|
||
05:45 PM
|
||
07:00 PM
|
quinta-feira, 28 de junho de 2012
Removendo caracteres de nova linha e tab em consultas no Oracle
Para remover caracteres de nova linha e tabulação (TAB) em textos no Oracle utilize a função REPLACE.
Sintaxe da função:
REPLACE (String_Original, String_para_Alterar, [String_Destino])
String_Original: Conteúdo original
String_para_Alterar: String que será pesquisa na String_Original
String_Destino: parâmetro opcional que indica qual conteúdo deve ficar em todas as ocorrências de String_para_Alterar na String_Original.
Exemplo: Select Replace('Fusca 1980','1980','1985') Retorna: 'Fusca 1985'
Select Replace('Fusca 1980','1980') Retorna: 'Fusca '
Para resolver o problema proposto neste post são "encadeados" vários replaces para obter o resultado esperado:
REPLACE(REPLACE(REPLACE(String_Original, CHR(10)), CHR(13)), CHR(9))
segunda-feira, 25 de junho de 2012
SQL Saturday 147

SQL Saturday são eventos de um dia inteiro de treinamento gratuito, com uma grande variedade de temas e com vários níveis de conhecimento, para atender todos os interessados em SQL Server.
Este evento é organizado pelo SQL Pass (http://www.sqlpass.org/) que é uma organização independente de profissionais SQL Server com mais de 100.000 afiliados no mundo.
No dia 25 as 11:30 estarei apresentando junto com o Marcus Vinicius Bittencourt (@mvbitt) como fazer replicação de informações no SQL Server e demonstrando na prática como replicar informações do Oracle para o SQL Server.
Neste link: http://www.sqlsaturday.com/147/schedule.aspx tem a agenda do evento com as palestras disponíveis.
Este evento é gratuito, portanto se tiveres interesse se inscreva logo para garantir a sua vaga.
sexta-feira, 1 de junho de 2012
SQL Server 2012 Restrições na Sintaxe do Raiserror
Ao migrar um banco de dados SQL Server 2008 R2 para outro servidor com a versão SQL Server 2012, nos deparamos com alguns cancelamentos logo após a autenticação do aplicativo.
Após uma análise de onde ocorria o problema chegamos em uma trigger que tinha os tratamentos de erros no formato:
RAISERROR integer 'string'
Não foi dificil depois disto concluir que este formato foi descontinuado nesta versão do banco de dados, devendo agora ser utilizado como RAISERROR(...).
Para maiores detalhes sobre as features descontinuadas no SQL Server 2012, acesse o link: http://technet.microsoft.com/en-us/library/ms144262(SQL.110).aspx
Após uma análise de onde ocorria o problema chegamos em uma trigger que tinha os tratamentos de erros no formato:
RAISERROR integer 'string'
Não foi dificil depois disto concluir que este formato foi descontinuado nesta versão do banco de dados, devendo agora ser utilizado como RAISERROR(...).
Para maiores detalhes sobre as features descontinuadas no SQL Server 2012, acesse o link: http://technet.microsoft.com/en-us/library/ms144262(SQL.110).aspx
quarta-feira, 16 de maio de 2012
Script de backup de todas as databases no SQL Server
Nas versões pagas do SQL Server, existem assistentes que facilitam o agendamento de tarefas de backup que gravem todos os databases existentes, sem a preocupação de que ao criar novas databases precise alterar estes procedimentos.
Em ambientes sem estes recursos, ou onde você prefirar criar manualmente estas atividades, sugiro o script abaixo, que irá selecionar todos os databases existentes na instância do servidor e executar para cada um a instrução de backup.
Para automatizar este procedimento copie o código abaixo e coloque em um arquivo neste exemplo chamado BACKUP.SQL.
Observe no início do script que tem o destino dos arquivos gerados pela rotina, altere conforme a tua necessidade.
Em ambientes sem estes recursos, ou onde você prefirar criar manualmente estas atividades, sugiro o script abaixo, que irá selecionar todos os databases existentes na instância do servidor e executar para cada um a instrução de backup.
Para automatizar este procedimento copie o código abaixo e coloque em um arquivo neste exemplo chamado BACKUP.SQL.
Observe no início do script que tem o destino dos arquivos gerados pela rotina, altere conforme a tua necessidade.
DECLARE @name VARCHAR(150) -- Nome do Database DECLARE @path VARCHAR(256) -- Caminho do arquivo de backup DECLARE @fileName VARCHAR(256) -- Arquivo do backup -- Define caminho de destino do backup SET @path = 'D:\Backup\' -- Cria um cursor para selecionar todas as databases, -- excluindo model, msdb e tempdb DECLARE db_cursor CURSOR FOR SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('model','msdb','tempdb') -- Abre o cursor e faz a primeira leitura OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name -- Loop de leitura das databases selecionadas WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '.BAK' -- Executa o backup para o database BACKUP DATABASE @name TO DISK = @fileName WITH FORMAT; FETCH NEXT FROM db_cursor INTO @name END -- Libera recursos alocados pelo cursor CLOSE db_cursor DEALLOCATE db_cursor
A seguir crie outro arquivo chamado BACKUP.BAT com o conteúdo abaixo:
osql -E -S Servidor -i "d:\backup\sql\BackupBancos.SQL"Agora basta criar um agendamento do próprio Windows chamando o arquivo BACKUP.BAT.
sexta-feira, 4 de maio de 2012
Webcast sobre Replicação no SQL Server
No dia 04 de maio de 2012 será realizada uma webcast para tratar de replicação, junto com o Marcus Vinicius @mvbitt serei um dos apresentadores do evento, quem tiver dispobilidade abaixo resumo do evento e link de inscrição:
Sexta – Feira (04/05)
Palestrante: Cesar Blumm (@cesarblumm)
e Marcus Vinícius Bittencourt (@mvbitt)
Palestra: Replicação na Prática
Descrição: Uma visão geral sobre replicação e suas formas de publicações. Será criada uma replicação na prática passo-a-passo.
Horário: 20:00 a 21:00
Link para inscrição: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032512282&Culture=pt-BR
Palestra: Replicação na Prática
Descrição: Uma visão geral sobre replicação e suas formas de publicações. Será criada uma replicação na prática passo-a-passo.
Horário: 20:00 a 21:00
Link para inscrição: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032512282&Culture=pt-BR
sábado, 21 de abril de 2012
Reunião do SQL Server RS em Abril/2012
No próximo dia 27/04/2012 será realizado mais um encontro de usuários de SQL Server do RS, na Flexxo (Av. Rio Branco 105, Caxias do Sul - RS).
O Crespi (Especialista SQL Server) falará sobre Troubleshoot (Database Engine).
Maiores informações no site do grupo: http://sqlserverrs.com.br.
O Crespi (Especialista SQL Server) falará sobre Troubleshoot (Database Engine).
Maiores informações no site do grupo: http://sqlserverrs.com.br.
segunda-feira, 2 de janeiro de 2012
Insert condicional em várias tabelas
No post anterior mostrei com usar o INSERT para inserir em várias tabelas. Utilizado daquela maneira, cada linha é inserida em todas as tabelas incluídas no comando. Mas outra variação de INSERT permite utilizar expressões lógicas para indicar em qual tabela uma linha deve ser inserida. Sua sintaxe é:
INSERT[ALL]
WHEN
THEN INTO
WHEN
THEN INTO
...
[ELSE INTO
SELECT .... ;
Cada condição lógica controla se uma linha específica deve ser inserida na respectiva tabela. a palavra chave ALL indica se todas as condições lógicas devem ser avaliadas, permitindo que a linha seja inserida em mais de uma tabela (sempre que a condição for verdadeira). Se ALL for omitida, a linha é inserida na primeira tabela cuja respectiva condição lógica for verdadeira. A claúsula ELSE é opcional permite inserir a linha na tabela caso todas as condições lógicas resultem falso. Uma consulta SELECT é obrigatória e pode ser simples ou tão complexa quanto necessário.
Por exemplo, digamos que há três tabelas VENDAS, VENDAS_2011 e VENDAS_HIST. a primeira armazena vendas realizadas em 2012, a segunda vendas de 2011 e a terceira vendas realizadas em qualquer outro ano. As três tabelas tem exatamente a mesma estrutura. O INSERT abaixo utiliza as condições lógicas para definir em qual tabela cada linha gerada pelo SELECT deve ser inserida.
WHEN EXTRACT(YEAR FROM data_venda) = 2012 THEN
INTO vendas VALUES (vendas_id, data_venda, valor)
WHEN EXTRACT(YEAR FROM data_venda) = 2011 THEN
INTO vendas_2011 VALUES (vendas_id, data_venda, valor*0.95)
ELSE INTO vendas_hist VALUES (vendas_id, data_venda, valor*0.9)
SELECT level vendas_id,
TRUNC(sysdate - dbms_random.value(0, 500)) data_venda,
TRUNC(dbms_random.value(1000, 2000), 2) valor
FROM dual
CONNECT BY level <= 100;
O SELECT resulta em 100 linhas representando vendas realizadas entre hoje e 500 dias atrás e valor entre 1000 e 2000. As condições lógicas no INSERT controlam em qual tabela cada linha deve ser inserida. Nesta caso, como cada linha deve ser inserida em apenas uma tabela, a palavra chave ALL é desnecessária. Note que o valor de vendas é multiplicado por diferentes fatores em cada INSERT, apenas para demonstrar que é possível alterar os valores. Também seria possível utilizar tabelas com diferentes colunas.
Há algumas restrições quanto ao SELECT, a mais relevante é quanto ao uso de sequences. O comando abaixo retorna um erro:
INSERT
WHEN EXTRACT(YEAR FROM data_venda) = 2012 THEN
INTO vendas VALUES (vendas_id, data_venda, valor)
WHEN EXTRACT(YEAR FROM data_venda) = 2011 THEN
INTO vendas_2011 VALUES (vendas_id, data_venda, valor*0.95)
ELSE INTO vendas_hist VALUES (vendas_id, data_venda, valor*0.9)
SELECT vendas_seq.nextval vendas_id,
TRUNC(sysdate - dbms_random.value(0, 500)) data_venda,
TRUNC(dbms_random.value(1000, 2000), 2) valor
FROM dual
CONNECT BY level <= 100;
SQL Error: ORA-02287: sequence number not allowed here
02287. 00000 - "sequence number not allowed here"
*Cause: The specified sequence number (CURRVAL or NEXTVAL) is inappropriate
here in the statement.
*Action: Remove the sequence number.
Entre as soluções possíveis, uma das simples é criar uma função para encapsular a sequence e depois usar a função no comando SELECT.
CREATE OR REPLACE
FUNCTION new_vendas_id
RETURN NUMBER
IS
retVal NUMBER;
BEGIN
SELECT vendas_seq.nextval INTO retVal FROM dual;
RETURN retVal;
END;
INSERT
WHEN EXTRACT(YEAR FROM data_venda) = 2012 THEN
INTO vendas VALUES (vendas_id, data_venda, valor)
WHEN EXTRACT(YEAR FROM data_venda) = 2011 THEN
INTO vendas_2011 VALUES (vendas_id, data_venda, valor*0.95)
ELSE INTO vendas_hist VALUES (vendas_id, data_venda, valor*0.9)
SELECT new_vendas_id vendas_id,
TRUNC(sysdate - dbms_random.value(0, 500)) data_venda,
TRUNC(dbms_random.value(1000, 2000), 2) valor
FROM dual
CONNECT BY level <= 100;
Esta solução para contornar o erro ORA-02287 pode ser útil em várias outras situações não relacionadas ao INSERT.
Assinar:
Postagens (Atom)