Array
(
)

Coluna VarChar, conteúdo com ; trazer em linhas

Ferefefe88
   - 11 jun 2015

Olá Pessoal,
Preciso fazer um select numa tabela. Esta tabela tem uma coluna que pode conter vários resultados separados por ponto e vírgula.
Gostaria de saber como trago esses resultados em linhas?
Coluna
'resultado1;resultado2;resultado3;'
Trazer assim
resultado1
resultado2
resultado3
Alguém sabe?
Obrigado!

Marcos P
   - 11 jun 2015

Separar as ocorrências dentro da mesma coluna, é simples de fazer ( use as funções CHARINDEX e SUBSTRING ).

A questão de desmembrar uma coluna em "n" linhas, já não parece ser tão tivial.

Existe um limite máximo de linhas que você vai gerar a partir de uma coluna ?

Se existir, você pode tentar montar uma query recursiva que execute a extração das informações tantas quantas forem as linhas a serem geradas.

Senão existir, com : um cursor + separação linha-a-linha + uma tabela temporária para armazenar as ocorrências... dá pra resolver isso !

Dê uma pensada nisso...

Ferefefe88
   - 11 jun 2015

Como faria utilizando o cursor e inserindo na tabela temporária ?

Marcos P
   - 11 jun 2015

O cursor recuperaria todas as ocorrências ( linhas ) com a string ( coluna ) que você quer desmembrar.

Em um loop você varreria todas as linhas do cursor e em um outro loop ( interno ao primeiro ), você desmembraria cada ocorrência de ";", inserindo o resultado na temporária.

Depois de varrer todas as linhas pelo cursor... a temporária teria todas as ocorrências que você procura !

Ferefefe88
   - 11 jun 2015

Tem algum exemplo disso?

Obrigado!

Jothaz
   - 11 jun 2015

Veja se o exemplo ajuda!

#Código
CREATE TABLE #TESTE (NUMERO INT, OBS VARCHAR(100), CODIGO_LIMPO VARCHAR(100))
INSERT INTO #TESTE (NUMERO,OBS) VALUES (1,'[2.10.AA] O ALVO É MOVEL')
INSERT INTO #TESTE (NUMERO,OBS) VALUES (2,'[2.10.AC] O ALVO É MOVEL')
INSERT INTO #TESTE (NUMERO,OBS) VALUES (3,'[2.10.SA] O ALVO[ED.DE.DE] É MOVEL')
INSERT INTO #TESTE (NUMERO,OBS) VALUES (4,'[2.10.VA] O ALVO [11.1.11]É MOVEL')

DECLARE @NUMERO INT, @OBS VARCHAR(100)
DECLARE MYCURSOR CURSOR FOR
SELECT NUMERO,OBS FROM #TESTE
OPEN MYCURSOR
FETCH NEXT FROM MYCURSOR
INTO @NUMERO,@OBS

WHILE @@FETCH_STATUS = 0
BEGIN

DECLARE @DELI_INI VARCHAR(5), @DELI_fim VARCHAR(5) ,@CONT INT, @AUX VARCHAR(200), @POS_INI INT, @POS_FIM INT

-- SETANDO O DELIMITADOR
SELECT @DELI_INI = '[', @DELI_fim = ']'

SELECT @OBS = LTRIM(RTRIM(@OBS))

PRINT @OBS + ' pri ' WHILE LEN(@OBS) > 0
BEGIN

SELECT @POS_INI = CHARINDEX(@DELI_INI, @OBS)
SELECT @POS_FIM = CHARINDEX(@DELI_FIM, @OBS)

IF @POS_INI > 0 AND @POS_FIM > 0
BEGIN
SELECT @CONT = (@POS_FIM - @POS_INI) + 1

SELECT @AUX = SUBSTRING(@OBS, @POS_INI, @CONT)

--PARA JOGAR NO CAMPO_LIMPO UTILIZE O UPDATE A SEGUI
UPDATE #TESTE SET CODIGO_LIMPO = @AUX WHERE NUMERO = @NUMERO
SELECT @OBS = SUBSTRING(@OBS, @POS_FIM + 1, LEN(@OBS))

END
ELSE
BEGIN
BREAK
END

END

FETCH NEXT FROM MYCURSOR
INTO @NUMERO,@OBS

END
CLOSE MYCURSOR
DEALLOCATE MYCURSOR

SELECT * FROM #TESTE

--DROP TABLE #TESTE

Marcos P
   - 11 jun 2015

Pronto, infelizmente, não tenho...

Mas você pode fazer, pesquisando os conceitos que coloquei.

Acredite, o melhor modo de aprender é fazendo !

Marcos P
   - 11 jun 2015

Esse exemplo do Jothaz é um ótimo ponto de partida !

Ferefefe88
   - 11 jun 2015

Obrigado galera!
Sabe o que vou precisar fazer depois?
Pegar estes resultados e fazer um DE PARA
Mas como atualizar um "stringuinho" num "stringao"?

Exemplo:
valor1;valor2;valor3;valor4

Transformar em

valor1;valor2;valorindefinido;valor4

Jothaz
   - 11 jun 2015

Você vai usar a mesma lógica do exemplo acima.

Localiza onde vai concatenar, var partir o campo (substring) e concatenar o que você quer.

Marcos P
   - 11 jun 2015

Exato... são variações de mesmo tema !