none
Trazer apenas a primeira letra do nome e sobrenome RRS feed

  • Pergunta

  • Bom dia pessoa será que por gentileza teria um comando no sql server de como trazer apenas as primeiras letras de nome e sobrenome da pessoa?

    Ex.: JOSÉ FERREIRA DE SOUZA

    RESULTADO: JFDS


    CharlesTI.

    sexta-feira, 30 de junho de 2017 14:06

Respostas

  • Segue uma outra forma de fazer , nativamente não tem porem podemos abstrair a logica em functios

    1) criei uma function que faz Split dos valores 

    CREATE FUNCTION dbo.SplitValues
        (
          @texto VARCHAR(200) ,
          @delimiter NVARCHAR(5)
        )
    RETURNS @Dados TABLE ( DATA VARCHAR(200) )
    AS
        BEGIN
            DECLARE @valor VARCHAR(200) = LTRIM(RTRIM(@texto));
    		
            DECLARE
                @prefixos NVARCHAR(MAX) ,
                @textXML XML;
    
            SELECT
                @prefixos = @valor;
            SELECT
                @textXML = CAST('<d>' + REPLACE(@prefixos, @delimiter, '</d><d>')
                + '</d>' AS XML);
            
            INSERT  INTO @Dados
                    SELECT
                        X.DATA
                    FROM
                        ( SELECT
                            T.split.value('.', 'nvarchar(max)') AS DATA
                          FROM
                            @textXML.nodes('/d') T ( SPLIT )
                        ) AS X;
    
            RETURN;
        END; 

    teste: SELECT * FROM  dbo.SplitValues('JOSÉ FERREIRA DE SOUZA',' ')

    apos criei uma função que recupera as iniciais 

    CREATE FUNCTION dbo.IniciaisNome ( @valor NVARCHAR(200),@separador NVARCHAR(5)  )
    RETURNS NVARCHAR(200)
        BEGIN
         
    	 
            DECLARE @Iniciais NVARCHAR(200) = ( SELECT
                                                    COALESCE(
    		(SELECT
                LEFT(SV.DATA, 1) + ' ' AS [text()]
             FROM
                dbo.SplitValues(@valor, @separador) AS SV
                                                    FOR XML PATH('') ,TYPE).value('.[1]',
                                                                'VARCHAR(MAX)'),
                                                            '')
                                              );
    
            RETURN @Iniciais;
        END;
      

    Agora e só executar a função

    SELECT  dbo.IniciaisNome('JOSÉ FERREIRA DE SOUZA',' ')


    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves


    Wesley Neves

    • Marcado como Resposta CHARLES.PTU sexta-feira, 30 de junho de 2017 19:15
    sexta-feira, 30 de junho de 2017 15:09

Todas as Respostas

  • Bom dia,

    Talvez exista outra alternativa melhor mas segue uma para teste:

    DECLARE @TESTE TABLE 
    (Id INT, Nome VARCHAR(50));
    
    INSERT INTO @TESTE (Id, Nome) VALUES (10, 'JOSÉ FERREIRA DE SOUZA');
    INSERT INTO @TESTE (Id, Nome) VALUES (20, 'MARIA DA SILVA');
    
    with CTE_Split as
    (
        SELECT
            f.Id,
            o.NomePartes
        FROM
        (
             SELECT 
                 Id,
                 cast('<X>' + replace(Nome, ' ', '</X><X>') + '</X>' as XML) as xmlfilter 
             from @TESTE
        ) f
        CROSS APPLY
        ( 
             SELECT 
                 fdata.D.value('.', 'varchar(50)') as NomePartes
             FROM f.xmlfilter.nodes('X') as fdata(D)
        ) o
    )
    
    SELECT 
        c.Id,
        (SELECT LEFT(s.NomePartes, 1)
         FROM CTE_Split as s
         WHERE s.Id = c.Id
         FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
    FROM CTE_Split as c
    GROUP BY
        c.Id
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 30 de junho de 2017 14:35
  • Deleted
    sexta-feira, 30 de junho de 2017 14:35
  • Segue uma outra forma de fazer , nativamente não tem porem podemos abstrair a logica em functios

    1) criei uma function que faz Split dos valores 

    CREATE FUNCTION dbo.SplitValues
        (
          @texto VARCHAR(200) ,
          @delimiter NVARCHAR(5)
        )
    RETURNS @Dados TABLE ( DATA VARCHAR(200) )
    AS
        BEGIN
            DECLARE @valor VARCHAR(200) = LTRIM(RTRIM(@texto));
    		
            DECLARE
                @prefixos NVARCHAR(MAX) ,
                @textXML XML;
    
            SELECT
                @prefixos = @valor;
            SELECT
                @textXML = CAST('<d>' + REPLACE(@prefixos, @delimiter, '</d><d>')
                + '</d>' AS XML);
            
            INSERT  INTO @Dados
                    SELECT
                        X.DATA
                    FROM
                        ( SELECT
                            T.split.value('.', 'nvarchar(max)') AS DATA
                          FROM
                            @textXML.nodes('/d') T ( SPLIT )
                        ) AS X;
    
            RETURN;
        END; 

    teste: SELECT * FROM  dbo.SplitValues('JOSÉ FERREIRA DE SOUZA',' ')

    apos criei uma função que recupera as iniciais 

    CREATE FUNCTION dbo.IniciaisNome ( @valor NVARCHAR(200),@separador NVARCHAR(5)  )
    RETURNS NVARCHAR(200)
        BEGIN
         
    	 
            DECLARE @Iniciais NVARCHAR(200) = ( SELECT
                                                    COALESCE(
    		(SELECT
                LEFT(SV.DATA, 1) + ' ' AS [text()]
             FROM
                dbo.SplitValues(@valor, @separador) AS SV
                                                    FOR XML PATH('') ,TYPE).value('.[1]',
                                                                'VARCHAR(MAX)'),
                                                            '')
                                              );
    
            RETURN @Iniciais;
        END;
      

    Agora e só executar a função

    SELECT  dbo.IniciaisNome('JOSÉ FERREIRA DE SOUZA',' ')


    Wesley Neves - Brasilia-DF


    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves



    Wesley Neves


    • Editado Wesley Neves sexta-feira, 30 de junho de 2017 15:08 erro
    sexta-feira, 30 de junho de 2017 15:02
  • Segue uma outra forma de fazer , nativamente não tem porem podemos abstrair a logica em functios

    1) criei uma function que faz Split dos valores 

    CREATE FUNCTION dbo.SplitValues
        (
          @texto VARCHAR(200) ,
          @delimiter NVARCHAR(5)
        )
    RETURNS @Dados TABLE ( DATA VARCHAR(200) )
    AS
        BEGIN
            DECLARE @valor VARCHAR(200) = LTRIM(RTRIM(@texto));
    		
            DECLARE
                @prefixos NVARCHAR(MAX) ,
                @textXML XML;
    
            SELECT
                @prefixos = @valor;
            SELECT
                @textXML = CAST('<d>' + REPLACE(@prefixos, @delimiter, '</d><d>')
                + '</d>' AS XML);
            
            INSERT  INTO @Dados
                    SELECT
                        X.DATA
                    FROM
                        ( SELECT
                            T.split.value('.', 'nvarchar(max)') AS DATA
                          FROM
                            @textXML.nodes('/d') T ( SPLIT )
                        ) AS X;
    
            RETURN;
        END; 

    teste: SELECT * FROM  dbo.SplitValues('JOSÉ FERREIRA DE SOUZA',' ')

    apos criei uma função que recupera as iniciais 

    CREATE FUNCTION dbo.IniciaisNome ( @valor NVARCHAR(200),@separador NVARCHAR(5)  )
    RETURNS NVARCHAR(200)
        BEGIN
         
    	 
            DECLARE @Iniciais NVARCHAR(200) = ( SELECT
                                                    COALESCE(
    		(SELECT
                LEFT(SV.DATA, 1) + ' ' AS [text()]
             FROM
                dbo.SplitValues(@valor, @separador) AS SV
                                                    FOR XML PATH('') ,TYPE).value('.[1]',
                                                                'VARCHAR(MAX)'),
                                                            '')
                                              );
    
            RETURN @Iniciais;
        END;
      

    Agora e só executar a função

    SELECT  dbo.IniciaisNome('JOSÉ FERREIRA DE SOUZA',' ')


    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves


    Wesley Neves

    • Marcado como Resposta CHARLES.PTU sexta-feira, 30 de junho de 2017 19:15
    sexta-feira, 30 de junho de 2017 15:09
  • Muito obrigado wesley, sua função me ajudou bastante, agora vou apenas mudar alguns campos de acordo com a tabela em questão que tenho aqui para poder me trazer estes dados.

    CharlesTI.

    sexta-feira, 30 de junho de 2017 19:15
  • teria como eu jogar estes dados encima da tabela que eu já tenho de dados aqui 

    select nome from ppessoa


    CharlesTI.

    sexta-feira, 30 de junho de 2017 19:17
  • Vc pode fazer algo assim

    SELECT TOP 23 P.NomeRazaoSocial
    iniciais = dbo.ufnRetornaSomenteInciaisDoNome(P.NomeRazaoSocial,' ')
     FROM Tabela AS P


    Wesley Neves - Brasilia-DF


    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves



    Wesley Neves

    sexta-feira, 30 de junho de 2017 20:22