quarta-feira, 31 de agosto de 2011

Função para retornar somente números em uma string no SQL Server

    Em algumas situações precisamos que a consulta de uma campo retorne somente o valor númerico, desprezando máscaras, ou valores inconsistentes, por exemplo o CEP sem as edições.
    Abaixo uma função para o SQL Server que "limpa" o conteúdo do campo deixando somente os caracteres numéricos no resultado.

CREATE FUNCTION [dbo].[TiraLetras]
 (
 @Resultado VARCHAR(8000)
 )
 RETURNS VARCHAR(8000)
 AS
 BEGIN
    DECLARE @CharInvalido SMALLINT
    SET @CharInvalido = PATINDEX('%[^0-9]%', @Resultado)
    WHILE @CharInvalido > 0
    BEGIN
       SET @Resultado = STUFF(@Resultado, @CharInvalido, 1, '')
       SET @CharInvalido = PATINDEX('%[^0-9]%', @Resultado)
    END
    SET @Resultado = @Resultado
    RETURN @Resultado
 END

Select dbo.TiraLetras('AB12CD34%¨&*(56')
Resultado: '123456'


Select dbo.TiraLetras('95.012-500') 'CEP'
Resultado:  '95012500'

quarta-feira, 13 de julho de 2011

Download do SQL Server Denali CTP3

   Foi liberado pela Microsoft o download do CTP3 da versão Denali (apelido da nova versão) do SQL Server.
   Diversos recursos novos estão presentes no Denali, abaixo os links para download:

    SQL Server Denali CTP3: https://www.microsoft.com/betaexperience/pd/SQLDCTP3CTA/enus/default.aspx
    Feature Packs: http://go.microsoft.com/fwlink/?LinkID=216742
    PowerPivot for Excel: http://www.microsoft.com/download/en/details.aspx?id=26721

domingo, 3 de julho de 2011

Eventos On-Line Imperdíveis de SQL Server

Nos próximos dias ocorrerão dois eventos on-line gratuitos sobre SQL Server que merecem o acompanhamento da comunidade SQL Server.

O primeiro será promovido pela empresa SolidQ e ocorrerá durante todo o mês de julho/2011 nas terças e quintas com duas sessões diárias as 20:00 e as 21:00.

Para inscrições acessem o site abaixo:
http://www.solidq.com/squ/courses/Pages/SolidQ-Virtual-Conference.aspx

Seguindo o embalo em agosto/2011 ocorrerá a Semana do SQL Server dos dias 1 a 6 também com duas sessões diárias as 21:00 e as 22:00. Para fazer a inscrição acessem o site abaixo:

https://www323.livemeeting.com/lrs/8000181573/Registration.aspx?pageName=h53mgg49dj267dkk

Abaixo as sessões:

01/08/2011 21:00 Era uma vez um reino de trevas... Denali + Windows Functions... e viveram felizes para sempre!


01/08/2011 22:00 Projeto Crescent - A Próxima Geração de Relatórios

02/08/2011 21:00 10 coisas que todo desenvolvedor deveria saber sobre SQL Server

02/08/2011 22:00 BI Semantic Model e PowerPivot for Excel vNext

03/08/2011 21:00 Data Collector: arquitetura, funcionamento e utilizações

03/08/2011 22:00 Primeiro contato com as ferramentas de BI do SQL Server - SSIS + SSAS + SSRS

04/08/2011 21:00 Extraindo, Transformando e Carregando Dados com o SQL Integration Services - Parte 1

04/08/2011 22:00 Extraindo, Transformando e Carregando Dados com o SQL Integration Services - Parte 2

05/08/2011 20:00 Gerenciando SQLServer Workloads com Resource Governor

05/08/2011 21:00 Evitando erros comuns na elaboração de código T-SQL

06/08/2011 22:00 SQL Server x SQL Azure, o que preciso saber?!

sábado, 25 de junho de 2011

Busca por string semelhantes, mas não iguais

Muitas vezes temos necessidade de procurar por string semelhantes, afinal é muito comum confundir-se entre diferentes grafias para palavras com o mesmo som, como Sousa e Souza.

A função de busca por semelhança mais conhecida em Oracle é SOUNDEX. Utilizando uma base com nomes de navios, posso procurar por nomes semelhantes a Brasil:

select vessel_name, t.cname
  from vessel
      (select 'BRASIL' cname from dual) t
where SOUNDEX(t.cname) = SOUNDEX(upper(vessel_name));


Considerando uma tabela com 52K navios, esta consulta retorna 33 linhas. Alguns nomes são realmente próximos, como Brazil, Brussel e Brazilian Lady. Outros nomes, nem tanto, como Barcelona, Bro Globe e Brooklin. Obviamente todos estes nomes correspondem ao mesmo valor quando aplicada a função SOUNDEX. Devido à implementação do SOUNDEX, todos navios começam com a letra B, pois a inicial deve ser a mesma.

Mas há outra função menos conhecida que pode ser bastante útil: Utl_Match.Edit_Distance_Similarity(s1, s2). A função compara duas strings e retorna o grau de similaridade entre elas, sempre um valor entre 0 e 100.

A query

select vessel_name, t.cname, utl_match.edit_distance_similarity(t.cname, upper(vessel_name)) simil
  from vessel,
      (select 'BRASIL' cname from dual) t
where utl_match.edit_distance_similarity(t.cname, upper(vessel_name)) > 50;

retorna 21 linhas, todas bastante similares (por que o valor deve ser maior que 50%), como Basil, Orasila e Hasil. É fácil notar que a primeira letra pode ser diferente, tornando a busca bem mais flexível.

Alterando o grau de similaridade, a query retorna um número diferente de linhas. Se o grau de similaridade for igual a 70, a consulta retorna 3 linhas apenas. Se for igual a 30, retorna 2156 linhas. No limite, grau de similaridade igual a 100 retorna somente valores exatamente iguais. Grau de similaridade igual a zero, retornaria todas as linhas da tabela.

Em um projeto que estou trabalhando, decidimos usar esta função exatamente porque o grau de similaridade pode ser um parâmetro na interface da aplicação ajustado pelo usuário, tornando as buscas mais flexíveis.

terça-feira, 14 de junho de 2011

Senhas case sensitive no Oracle 11

O padrão de configuração de senhas do Oracle 11 é case sensitive (distinção entre letras maiúsculas e minúsculas).

Para verificar esta configuração utilize a instrução SQL:
SHOW PARAMETER SEC_CASE_SENSITIVE_LOGON

Para desativar este recurso de segurança utilize a instrução:
ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;

sexta-feira, 27 de maio de 2011

Exportando tabelas vazias com o EXP no Oracle 11

  No Oracle 11 tem um parâmetro (deferred_segment_creation) que indica ao SGBD para não alocar segmentos no banco de dados enquanto uma tabela está vazia, desta forma economizando espaço.
  A configuração padrão de instalação é ativo (TRUE).
  Desta forma quem utiliza o utilitário exp para exportar as informações do banco de dados, observa que todas as tabelas vazias não são geradas no arquivo de exportação, sendo que em alguns casos isto é um problema.
  Para resolver esta situação existem algumas procedimentos que podem ser feitos, o primeiro é trocar a exportação do exp pelo utilitário expdp.
  Outra forma é desativar esta opção através dos comandos ALTER SESSION, ALTER SYSTEM deixando este parâmetro com o valor FALSE.

        ALTER SYSTEM SET deferred_segment_creation=FALSE;
  Entretanto esta segunda opção somente irá valer para as tabelas criadas após a execução do comando. Para resolver esta situação nas tabelas já criadas e vazias utilizar a instrução:

        ALTER TABLE nome_da_tabela ALLOCATE EXTENT;

segunda-feira, 11 de abril de 2011

Melhore o desempenho do SQL Server reservando memória

   Na configuração padrão do SQL Server a alocação de memória é dinâmica, sendo alocada a medida que o banco de dados precisa.   
   Se o servidor for dedicado ao banco de dados, altere a configuração do servidor para alocar até 75% da memória disponível para o SQL Server. No servidor abaixo 2GB serão alocados para o SQL Server logo que ele carrega.

Configuração de Memória do SQL Server