Pergunta

Eu tenho o seguinte script SQL:

DECLARE @temp table (
    ID int IDENTITY(1, 1),
    data nvarchar(100)
)

INSERT INTO @temp (data) VALUES ('a,b,c')
INSERT INTO @temp (data) VALUES ('d,e,f')

SELECT *
FROM @temp AS T
    INNER JOIN
        (SELECT *
        FROM dbo.__StringSplit(T.data, ',', T.ID)) AS S
    ON T.ID = S.RefID
!

E depois clicar em Executar, eu tenho estes:

Line 17 The multi-part identifier "T.data" could not be bound.

Eu também tentei a não se juntar a versão e tenho o mesmo erro:

SELECT T.ID, S.Item AS dataItem
FROM @temp AS T, dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID

...

O que eu esperava era que eu deveria recebe uma tabela com IDs vindo @ test.ID e cada um valores separados por vírgula em @ test.data fica dividido em seus próprios registros e seu valor colocado no campo dataItem .

Como posso conseguir isso?
Am I necessário para utilizar cursores?

Eu colou o dbo .__ StringSplit implementação em função de valor de tabela em http://pastebin.com/f7dd6350f

Obrigado!

Foi útil?

Solução

Em SQL2000 você precisa cursores. Em SQL2005 / 2008, você pode usar CROSS APLICAR satement; provavelmente como próximo (não pode testar apenas agora):

SELECT T.ID, S.Item AS dataItem
FROM @temp AS T CROSS APPLY dbo.__StringSplit(T.data, ',', T.ID) AS S

Editar - Eu encontrei desta página no CROSS APLICAR e depois veio com:

SELECT T.ID, S.Item AS dataItem
FROM @temp AS T
    CROSS APPLY
    dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID

O que resolveu o meu problema: -)

Outras dicas

sua função string divisão é realmente lento, aqui está um link para fazer um muito mais rápido um:

http://www.sommarskog.se/arrays-in-sql.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top