sexta-feira, 13 de maio de 2011

Função para contar palavra

Gostaria de compartilhar com vocês um problema que tive de resolver a pouco tempo em um script SQL (que logo estarei postando para vocês esse script).

Enfim, meu problema era que precisava saber quantas vezes um determinado termo ou caracter aparecia em uma String. Precisava resolver esse problema através de uma função... por isso, segue abaixo um exemplo de solução:

 create function fc_conta_palavra(@palavra varchar(100),  
                                     @string varchar(max))  
 returns int  
 as  
 begin  
    -- declaração variáveis usadas na função  
    declare @contador int, @contadorpalavra int  
   
    --contador de quantas vezes apareceu a palavra  
    set @contadorPalavra = 0  
   
    --contador do loop  
    set @contador = 0  
   
    -- loop  
    while @contador <= len(@string)  
    begin  
   
       --se encontrar a palavra soma mais um para @contadorPalavra  
       set @contadorPalavra =  
          case when substring(@string, @contador, len(@palavra)) = @palavra  
             then @contadorPalavra + 1  
             else @contadorPalavra  
          end  
   
       --soma mais um ao contador do laço while  
       set @contador = @contador + 1  
   
    end  
   
    -- retorna valor  
    return @contadorPalavra  
 end  

Se alguém souber como resolver usando funções nativas do SQL Server, por favor, comentem a solução nesse post.

Bom, espero que tenham gostado!

terça-feira, 10 de maio de 2011

Script para dropar objetos com nome em comum

Hoje gostaria de postar um script bem simples mas que pode ser muito útil quando se necessita dropar um lote de objetos que tenham uma determinada "caracteristica" em comum. O exemplo pode não resolver seu problema, mas certamente servirá de idéia se você realmente estiver precisando.

Bom, no exemplo que estou postando, tenho na tabela GEUSUARI os códigos dos usuários do sistema. Quero apagar todas as tabelas que estejam variando o nome por código de usuário. Vejamos como fica o script para resolver esse probleminha...

 use SUABASE
   
 --primeiramente temos um cursor que irá ler todos os objetos do MSSQL  
 --levando em consideraçao a restricao imposta na clausula where  
 declare tabelas_cursor cursor   
      for  
      select name  
      from sysobjects   
      where xtype = 'U'  
      and right(name,3) in (select cd_usuario from GEUSUARI with(nolock) where usuario <> 'SUPERVISOR')  
      order by name  
        
 open tabelas_cursor  
   
 declare @objeto sysname  
   
 fetch next from tabelas_cursor   
 into @objeto  
   
 --laço while que irá ler todos os objetos retornados do cursor  
 while @@fetch_status <> -1  
 begin  
      --executa SQL dinâmico  
      exec('drop table ' + @objeto+'')  
     
      fetch next from tabelas_cursor   
      into @objeto  
 end  
   
 print 'Todas as tabelas de usuário foram apagadas.'  
   
 close tabelas_cursor  
 deallocate tabelas_cursor  
Bom, fazendo isso todas as tabelas que tenham no final do seu nome um código de usuário do sistema foram dropadas.

Valeu!