Consulta SQL - Desmembrar String

Boa noite.

Preciso de uma ajuda, para devidos fins, faz necessário desmembrar uma String em uma consulta, fazer em java foi fácil o problema é jogar no SQL.

Cod…|…Descricao…|…Pagamento
01…|…3x…|…30,90,120
02…|…2x…|…00,30

retorno teria que ser…

Descricao…|…Pagamento
3x…|…30
3x…|…90
3x…|…120
2x…|…00
2x…|…30

Em java resolvi da seguinte forma…


public class teste {
    public static void main(String[] args) {

        String forma = "10,20,30,40,50,60,70,80,90,100,110,120,130,140";

        int inicio = 0;

        for (int cont = 0; cont < forma.length(); cont++) {

            if (forma.substring(cont, cont + 1).equals(",")) {
                System.out.println(forma.substring(inicio, cont));
                inicio = cont + 1;
            }
        }
        System.out.println(forma.substring(inicio, forma.length()));

    }
}

Essa é meio cabeluda mesmo… em que banco está isso?

Não entendi o que você quer,
pelo visto seu banco não está normalizado, é isso?

Boa noite, desde já agradeço o interesse.

O Banco é SQL Server 2008.

[quote=cfred]Não entendi o que você quer,
pelo visto seu banco não está normalizado, é isso?
[/quote]

Boa noite, obrigado pelo interesse.

Sim, o banco esta normalizado,

O problema é o seguinte.

Essa consulta fara parte de um Resumo Financeiro, onde apos ter sido montada uma carga de entrega, o sistema ira emitir 2 relatorio, o 1 é a um relatorio simples com os produtos aglutinados.

o 2 a qual essa sentença fara parte seria do Resumo financeiro, onde é necessario sair no relatorio o nome , data emissao, valor parcela ( se for parcelado), e o vencimento da parcela.

O sistema já trata esta data de vencimento, so que trata somente apos o pedido ser faturado, e no caso deste relatorio (necessidade do cliente) ele sai antes de ser faturado, porem o mesmo precisa destas datas de vencimento. e a tabela que traz a forma de pagamento, traz somente como “00,30,60, etc…”

dai a necessidade de desmembrar o campo, pois preciso saber qtos dias acrescentar a data de emissao para virar a data de vencimento (particularidades do cliente).

Sendo SQLServer 2008 tem um exemplo aqui muito próximo da sua necessidade:
http://www.kodyaz.com/articles//t-sql-convert-split-delimeted-string-as-rows-using-xml.aspx
Tem duas versões, uma ‘inline’ e outra criando uma função. Internamente elas usam XML (ou seja, cabeludas mesmo!)

Função Split, créditos do site Kodyaz:

[code]CREATE FUNCTION Split
(
@delimited nvarchar(max),
@delimiter nvarchar(100)
) RETURNS @t TABLE
(
– Coluna Id pode ser comentada, não necessária para fazer o split na string
id int identity(1,1), – Eu usei esta coluna para numerar as partes ‘splitted’
val nvarchar(max)
)
AS
BEGIN
declare @xml xml
set @xml = N’’ + replace(@delimited,@delimiter,’’) + ‘’

insert into @t(val)
select
r.value(’.’,‘varchar(5)’) as item
from @xml.nodes(’//root/r’) as records®

RETURN
END
GO

SELECT * FROM dbo.Split(N’a,b,c,d,e’, ‘,’)[/code]

Adaptando de forma livre, supondo que FormasPgto é sua tabela principal e Prazos é uma tabela com todos os números de dias possíveis 30,60,90,00 etc… (essa acho que você terá que criar)

SELECT FormasPgto.Descricao, Prazos.ndias FROM FormasPgto CROSS APPLY dbo.split(FormasPgto.Pagamento,',') split INNER JOIN Prazos ON Prazos.ndias = split.val

Muito obrigado pela atenção, vou efetuar teste e amanha postarei o resultado.

rsrsrs

Essa solução parece mesmo atender. Lembra bem uma coisa que fiz em Oracle uma vez, que usa uma parada chamada “função pipelined”.

Sucesso aí, e, como o pessoal do fórum gosta de recomendar, coloque [RESOLVIDO] no título do post se tiver dado certo.