Função Split no SQL 2005 - Recursividade usando Common Table Expressions ( CTE )
Imagine que você tenha um aplicativo de pesquisa Online de múltipla escolha,
que armezene o ID do usuário e as respostas, uma ao lado da outra, no mesmo campo, delimitadas por "|".
Agora você precisa extrair os dados dessa coluna de forma que cada resposta apareca em uma linha,como na imagem abaixo :

Vamos iniciar a criação do nosso ambiente.1o nossa tabela PESQUISA,
que terá um campo ID ( Chave ) e um campo RESPOSTAS
CREATE TABLE DBO.PESQUISA
(
ID INT IDENTITY(1,1) NOT NULL,
RESPOSTAS VARCHAR(8000) NOT NULL
)
GO
ALTER TABLE DBO.PESQUISA ADD CONSTRAINT [PK_PESQUISA] PRIMARY KEY( ID )
GO
Vamos popular nossa tabela para simular alguns cadastros :
INSERT INTO DBO.PESQUISA ( RESPOSTAS )
SELECT 'a | b | c' UNION ALL
SELECT 'b | c' UNION ALL
SELECT 'a | c' UNION ALL
SELECT 'c' UNION ALL
SELECT 'a | b' UNION ALL
SELECT 'a' UNION ALL
SELECT 'b'
GO
Com nosso ambiente montado, agora usaremos Commom Table Expression
para criar nosso "Split" de dados na coluna RESPOSTAS,
separando os dados a cada "|" e mostrando cada um em uma linha:
DECLARE @delimitador VARCHAR(3)
SET @delimitador = '|'
;WITH SqlSplit(id, i, j, respostas)
AS(
SELECT id, i = 1, j = CHARINDEX(@delimitador, RESPOSTAS + @delimitador), respostas
FROM DBO.PESQUISA
UNION ALL
SELECT id, i = j + 1, j = CHARINDEX(@delimitador, RESPOSTAS + @delimitador, j + 1), respostas
FROM SqlSplit
WHERE CHARINDEX(@delimitador, RESPOSTAS + @delimitador, j + 1) <> 0
)
SELECT ID, LTRIM(RTRIM(SUBSTRING(RESPOSTAS, i, j-i))) RESPOSTAS
FROM SqlSplit
WHERE SUBSTRING(RESPOSTAS, i, j-i) <> ''
ORDER BY id Nosso resultado :
Espero que seja útil
[]s
Recursive T-SQL Split Function
http://www.kodyaz.com/articles/sql-server-t-sql-split-function.aspx
WITH common_table_expression ( Transact-SQL )
http://msdn.microsoft.com/pt-br/library/ms175972.aspx
CHARINDEX ( Transact-SQL )
http://msdn.microsoft.com/en-us/library/ms186323.aspx
SUBSTRING ( Transact-SQL )
http://msdn.microsoft.com/pt-br/library/ms187748.aspx