Marcelo Ramos

Desenvolvimento em .NET, Banco de Dados e Tecnologia em Geral

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

Posted: jun 07 2009, 12:56 by marcelo | Comentários (27) RSS comment feed |
  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Filed under: Dicas de Tecnologia | SQL

Comentários

Comentar


(Vai mostrar seu Gravatar)  

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading