none
Consulta SQL RRS feed

  • Pergunta

  • Bom dia A TODOS!!!

    Eu estou precisando de fazer uma consulta no meu banco de dados da seguinte forma!!!!

    Tabela Clientes

    CodCli     -----    integer
    NomeCli  -----    Varchar(50)

    Eu quero que a condição leia linha por linha do meu Banco e so traga aqueles clientes que possuem nomes superiores a 10 caracter,

    por exemplo  '' Diego de Souza''  ---- nenhuma sas 3 palavras tem mais de 10 caracter
    exemplo 2 '' Diego CruzdeSouza''  ---- esse ja deve trazer porque tem mais de 10 caracter colado sem espaço...

    eu preciso disso idependente se ta no começo ou no fim, mas eu preciso tambem que toda vez que ele tiver espaço ele começe a recontar novamente...

    Aguem pode me ajuda????
    sexta-feira, 26 de fevereiro de 2010 12:37

Respostas

  • Boa Tarde,

    Acredito que o XML seja mais performático nesse caso.

    DECLARE @T TABLE (CodCli INT, NomeCli Varchar(50))
    INSERT INTO @T VALUES (1,'Diego de Souza')
    INSERT INTO @T VALUES (2,'Diego CruzdeSouza')
    INSERT INTO @T VALUES (3,'Renato Trindade')
    INSERT INTO @T VALUES (4,'RenatoTrindade')
    DECLARE @Tamanho INT
    SET @Tamanho = 10
    SELECT
     CodCli, NomeCli
    FROM @T
    WHERE LEN(
    CAST(CAST(('<E><e>'+ REPLACE(NomeCli,' ','</e><e>') + '</e></E>') As XML).query(
     'for $e in /E/e where string-length(($e/text())[1]) > sql:variable("@Tamanho") return $e') As VARCHAR(MAX))) > 1


    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Encontrando tabelas não utilizadas
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!957.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar domingo, 28 de fevereiro de 2010 18:05
    • Marcado como Resposta DiegoVix segunda-feira, 3 de abril de 2017 20:45
    domingo, 28 de fevereiro de 2010 18:05

Todas as Respostas

  • Diego,

    Você deseja fazer cada palavra que compõem um nome, se esta palavra possuir mais de 10 caracteres o nome deverá ser exibido?

    Mas qual é a sua necessidade, pois trata-se de um procedimento um muito complexo para o SQL Server executar e com certeza poderá gerar lentidão.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sexta-feira, 26 de fevereiro de 2010 12:40
  • Bom dia Pedro!!!

    Meu problema e o seguinte, foi migrado a pouco tempo um bando de dados com alguns clientes que foram cadastrados com seus nomes errados no outro programa... coisas que vieram errado desde o programa antigo... agora preciso fazer uma listagem destes clientes que estao com esse tipo de problema, pra mim repassar para os usuarios do programa para irem acertando. Ai eu preciso de uma consulta assim... Se tem como me da uma ideia de outra forma melhor de eu resolver isso??? eu sou novo no SQL Server!!!!
    sexta-feira, 26 de fevereiro de 2010 12:45
  • Diego,

    Realmente é algum muito complicado, como temos variação de valores, por se tratar de um campo com dados dinâmicos e não de tamanho fixo complica mais ainda.

    Se os dados foram cadastrados errados, o correto é fazer uma análise sobre estes dados, você não possui nenhuma outra table que possa server de parâmetro para realizar uma comparação do que esta certo com o errado?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sexta-feira, 26 de fevereiro de 2010 13:27
  • Tenho nao, eu tive essa ideia de ler as palavras com mais de 10 caracter... pq foi o unico jeito de eu encontrei de achar esses erros entende... mas tipo... se o nome da pessoa for assim Ana Clara, e ele tiver assim AnaClara, mesmo assim eu nao vou achar... porque ele tem menos de 10 caracter... entendeu???? eu rodei um script que me enviaram em outro forum e funcionou... o unico problema foi que ele ia quebrando as palavras com menos de 10 caracter

    Declare @Contador int

    Set @Contador = 1

    While @Contador < (select count(nome) from #Nomes)
    Begin
      update #nomes set Sobrenome1 = (select substring(nome, patindex('% %',nome)+1, len(nome)) from #Nomes where controle=@Contador) where controle=@Contador
      update #nomes set PrimeiroNome = (select substring(nome, 1, patindex('% %',nome)-1) from #Nomes where controle=@Contador) where controle=@Contador
      Set @Contador = @Contador + 1
    End

    Set @Contador = 1

    While @Contador < (select count(nome) from #Nomes)
    Begin
      update #nomes set Sobrenome2 = (select substring(Sobrenome1, patindex('% %',Sobrenome1)+1, len(Sobrenome1)) from #Nomes where controle=@Contador) where controle=@Contador
      update #nomes set Sobrenome1 = (select substring(Sobrenome1, 1, patindex('% %',Sobrenome1)-1) from #Nomes where controle=@Contador) where controle=@Contador
      update #Nomes set Sobrenome2= null where Sobrenome1=Sobrenome2
      Set @Contador = @Contador + 1
    End

    Set @Contador = 1

    While @Contador < (select count(nome) from #Nomes)
    Begin
      update #nomes set Sobrenome3 = (select substring(Sobrenome2, patindex('% %',Sobrenome2)+1, len(Sobrenome2)) from #Nomes where controle=@Contador) where controle=@Contador
      update #nomes set Sobrenome2 = (select substring(Sobrenome2, 1, patindex('% %',Sobrenome2)-1) from #Nomes where controle=@Contador) where controle=@Contador
      update #Nomes set Sobrenome3= null where Sobrenome2=Sobrenome3
      Set @Contador = @Contador + 1
    End


    entendeu????

    sexta-feira, 26 de fevereiro de 2010 19:00
  • Cara você já tentou utilizar FUNCTION com CTE's recursivas, a logica fica bem mais simples e flexivel.
    Com isso você pode fazer um select simples na sua tabela de clientes e se precisar implementar alguma coisa nova fica facil.
    Caso você não conheça sobre CTE's recursivas estou mando um exemplo de como poderia ser a FUNCTION:

    CREATE FUNCTION fn_Tamanho(@Linha varchar(20)) 
      RETURNS int
    AS BEGIN
      DECLARE @conta int; set @conta = 0;
      DECLARE @Sep char(1); set @Sep = ' ';
      WITH 
        cte_Texto (Palavra, Linha) as (
          SELECT 
            convert(varchar(20), SUBSTRING(@Linha,1,CHARINDEX(@Sep,@Linha,1) - 1)) as Palavra,
            convert(varchar(20), SUBSTRING(@Linha,CHARINDEX(@Sep,@Linha,1) + 1, LEN(@Linha)) + @Sep) as Linha
          UNION ALL
          SELECT 
            convert(varchar(20),SUBSTRING(c.Linha,1,CHARINDEX(@Sep,c.Linha,1) - 1)) as Palavra,
            convert(varchar(20),SUBSTRING(c.Linha,CHARINDEX(@Sep,c.Linha,1) + 1, LEN(c.Linha))) as Linha
          FROM cte_Texto c
          WHERE LEN(c.Linha) > 0
        )
      SELECT @Conta = Count(*) FROM cte_Texto WHERE Len(Palavra) >= 10
      RETURN @Conta
    END   
    GO
    

    E para utilizar a FUNCTION
    select * 
    from clientes
    where dbo.fn_tamanho(nome) > 0
    CTE's com recursividade é um recurso bem legal, procure informação a respeito.



    Alexandre Baseio Se a minha ajuda lhe for útil não esqueça de classificar.
    sábado, 27 de fevereiro de 2010 15:22
  • Boa Tarde,

    Acredito que o XML seja mais performático nesse caso.

    DECLARE @T TABLE (CodCli INT, NomeCli Varchar(50))
    INSERT INTO @T VALUES (1,'Diego de Souza')
    INSERT INTO @T VALUES (2,'Diego CruzdeSouza')
    INSERT INTO @T VALUES (3,'Renato Trindade')
    INSERT INTO @T VALUES (4,'RenatoTrindade')
    DECLARE @Tamanho INT
    SET @Tamanho = 10
    SELECT
     CodCli, NomeCli
    FROM @T
    WHERE LEN(
    CAST(CAST(('<E><e>'+ REPLACE(NomeCli,' ','</e><e>') + '</e></E>') As XML).query(
     'for $e in /E/e where string-length(($e/text())[1]) > sql:variable("@Tamanho") return $e') As VARCHAR(MAX))) > 1


    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Encontrando tabelas não utilizadas
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!957.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar domingo, 28 de fevereiro de 2010 18:05
    • Marcado como Resposta DiegoVix segunda-feira, 3 de abril de 2017 20:45
    domingo, 28 de fevereiro de 2010 18:05