none
SQL Recursivo em Campo Varchar RRS feed

  • Pergunta

  • Galera estou com duvida em criar um código recursivo para extrair dados de um único campo string

      o Campo esta populado com a seguinte string ("Varchar")

    ATV | Recursos   

    005 | 101561[3];101593[0.5];101780[1]

    e preciso que retorne os seguintes registros :

    ATV | Código | qtdade

    005 | 101561 | 3

    005 | 101593 | 0.5

    005 | 101780 | 1



    terça-feira, 5 de maio de 2015 12:52

Respostas

Todas as Respostas

  • Veja esse exemplo:

    http://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-into-individual-rows


    O que vc tem sao dois "splits"... o primeiro quebra a string usando o ";" em multiplas linhas.. o segundo usa o "[" para criar uma nova coluna (essa parte vai ter que ser tratada de forma bem especifica, pois após o split vai sobra o caractere "]")

    O exemplo do link mostra como retornar uma tabela a partir de uma string separada por ","(virgula) que vai atender a primeira parte do seu problema... a segunda basta seguir esse outro exemplo:

    http://stackoverflow.com/questions/10581772/how-to-split-a-comma-separated-value-to-columns

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 5 de maio de 2015 13:10
  • Bom dia,

    Denilson, a quantidade de códigos existentes na coluna Recursos é fixa?

    Está limitada a 3 ou é apenas um exemplo?


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

    terça-feira, 5 de maio de 2015 13:11
  • é apenas um exemplo, pois pode ter casos maiores que 3 códigos

    terça-feira, 5 de maio de 2015 13:28
  • Bom dia,

    Fiz o código abaixo pode utilizá-lo e adaptar a sua realidade.

    CREATE FUNCTION [dbo].[F_SPLIT](@STRING VARCHAR(MAX), @DELIMITADOR VARCHAR(3000)
    ) RETURNS @RESULT TABLE (ITENS VARCHAR(8000))
    BEGIN
    DECLARE @parte VARCHAR(8000)
    	WHILE CHARINDEX(@DELIMITADOR,@STRING,0) <> 0
    	BEGIN
    		SELECT
    			@parte=RTRIM(LTRIM(SUBSTRING(@STRING,1,CHARINDEX(@DELIMITADOR,@STRING,0)-1))),
    			@STRING=RTRIM(LTRIM(SUBSTRING(@STRING,CHARINDEX(@DELIMITADOR,@STRING,0)+LEN(@DELIMITADOR),LEN(@STRING))))
    		IF LEN(@parte) > 0
    			INSERT INTO @RESULT SELECT @parte
    	END
    
    	IF LEN(@STRING) > 0
    		INSERT INTO @RESULT SELECT @STRING
    RETURN
    END

    SELECT * FROM DBO.[F_SPLIT] ('12333|1212222|23Y3UDJWELFHJ|JEDOIJEDJDDLK|HEJKEHEJHEK|HEJKHEJEHJKE|','|')
    Vale lembrar que esse tipo de função tem um custo muito alto para o SQL Server o melhor cenário seria fazer isso via aplicação, também pode ser criado uma função para fazer isso e no C# gerar um assembly e 'importar' para o sql server e usar ele. Link


    Atenciosamente, Ruberlei. www.t-sql.com.br


    • Sugerido como Resposta Ruberlei sábado, 9 de maio de 2015 14:34
    • Editado Ruberlei sábado, 9 de maio de 2015 14:37 Melhoria
    sábado, 9 de maio de 2015 14:34