Script para quebrar 1 campo em várias linhas no SQL Server

Hoje vou mostrar como quebrar um campo com separações (como por exemplo, por vírgula), e transformá-lo em várias linhas.

Como exemplo, vamos pegar a condição de pagamento no Protheus, nela é possível separar os dias que o cliente vai pagar, então por exemplo, “10,20,30” seriam 10 dias, 20 dias e 30 dias.

A ideia da lógica para quebrar é simples, pegar a expressão, fazer um laço de repetição, e a cada vírgula (ou caractere de separação), gravar uma linha em uma tabela temporária, e depois utilizar a tabela temporária com um join.

Abaixo um print, de como é o campo na Condição de Pagamento, e como ficou o resultado com o script:

Exemplo de quebra de campo

E abaixo, o código desenvolvido:

--Declarando variáveis
Declare @Pedido   Varchar(6)
Declare @CondPag  Varchar(3)
Declare @Condicao Varchar(60)
Declare @Proxima  Varchar(10)
Declare @Separa   Varchar(1)

--Definindo o pedido e a condição de pagamento
Set @Pedido  = '159284'
Set @CondPag = '002'
Set @Separa  = ','

--Selecionando a condição
Set @Condicao = (SELECT RTRIM(E4_COND) FROM SE4010 WHERE E4_CODIGO = @CondPag)

--Criando uma tabela temporária
CREATE TABLE #EXEC_TMP (COD_CONDICAO Varchar(3), CONDICAO Varchar(10))

--Enquanto houver texto na variável de condição
WHILE @Condicao != ''
BEGIN
	--Se tiver uma vírgula, pega o resto do texto até ela
	If CharIndex(@Separa, @Condicao) != 0
		Set @Proxima = SUBSTRING(@Condicao, 1, CharIndex(@Separa, @Condicao)-1)

	--Senão, o resto do texto será o que está faltando
	Else
		Begin
			Set @Proxima = @Condicao
			Set @Condicao = ''
		End

	--Insere a condição na temporária
	Insert Into #EXEC_TMP VALUES (@CondPag, @Proxima)

	--Atualiza a variável, retirando a condição que já foi adicionada na temporária
	Set @Condicao = SUBSTRING(@Condicao, CharIndex(@Separa, @Condicao)+1, Len(@Condicao))
END

--Agora, fazemos uma consulta no pedido, fazendo um join com a temporária para ver o resultado
SELECT
	C5_NUM, CONDICAO
FROM
	SC5010 SC5
	INNER JOIN #EXEC_TMP ON (
		C5_CONDPAG = COD_CONDICAO
	)
WHERE
	C5_FILIAL = '01'
	AND C5_NUM = @Pedido
	AND SC5.D_E_L_E_T_ = ' '

--Por fim, dropamos a temporária
DROP TABLE #EXEC_TMP

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta