Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Morpheus#2005

Extraindo partes de compo delimitado por [] (colchetes)

Recommended Posts

A ideia é criar um delimitador de '[', tipo :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 MYCURSORFETCH NEXT FROM MYCURSOR INTO @NUMERO,@OBSWHILE @@FETCH_STATUS = 0BEGIN DECLARE @DELI_INI VARCHAR(5), @DELI_fim VARCHAR(5) ,@CONT INT, @AUX VARCHAR(200), @POS_INI INT, @POS_FIM INT-- SETANDO O DELIMITADORSELECT @DELI_INI = '[', @DELI_fim = ']'SELECT @OBS = LTRIM(RTRIM(@OBS))PRINT @OBS + ' pri ' WHILE LEN(@OBS) > 0BEGIN 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) + 1SELECT @AUX = SUBSTRING(@OBS, @POS_INI, @CONT)--PARA JOGAR NO CAMPO_LIMPO UTILIZE O UPDATE A SEGUIUPDATE #TESTE SET CODIGO_LIMPO = @AUX WHERE NUMERO = @NUMEROSELECT @OBS = SUBSTRING(@OBS, @POS_FIM + 1, LEN(@OBS))ENDELSEBEGIN BREAK ENDENDFETCH NEXT FROM MYCURSOR INTO @NUMERO,@OBSENDCLOSE MYCURSORDEALLOCATE MYCURSORSELECT * FROM #TESTE DROP TABLE #TESTE Jothaz....Muito Obrigado pela ajuda.... mas será q tem como contar o que esta dentro dos dois COLCHETES ??Abraços a todos e mais uma vez mostramos o porque do fórum esta bombando...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Morpheus#2005,

 

Fico feliz q a dica que dei ajudou!

 

Bom pra tudo têm um jeito nesse numdo. Para o que não têm jeito a morte dá um jeito!! ahahahah

 

Mão não entendi a pergunta:

mas será q tem como contar o que esta dentro dos dois COLCHETES

você conta o numero de caracteres?

Quer somar o números?

 

Dê um exemplo de como seria esta soma com este campo:

'[2.10.VA] O ALVO [11.1.11]É MOVEL'

 

 

t+

 

 

A ideia é criar um delimitador de '[', tipo :

 

 

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

 

 

 

Jothaz....Muito Obrigado pela ajuda.... mas será q tem como contar o que esta dentro dos dois COLCHETES ??

 

Abraços a todos e mais uma vez mostramos o porque do fórum esta bombando...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não preciso contar não só preciso separar quando for assim :MARIA FOI A FEIRA [22.22.22] E COMPROU [ 22.55.55] ...RESULTADO[22.22.22] [ 22.55.55]oK

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,Vou analizar me dê um tempo, pois a coisa tá só complicando http://forum.imasters.com.br/public/style_emoticons/default/grin.gif , e lhe retorno.Mas acho que vai ser possivel sim.t+

Não preciso contar não só preciso separar quando for assim :MARIA FOI A FEIRA [22.22.22] E COMPROU [ 22.55.55] ...RESULTADO[22.22.22] [ 22.55.55]oK

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

Acho que é isso aqui:

CREATE TABLE #TESTE (NUMERO INT, OBS VARCHAR(100), CODIGO_LIMPO VARCHAR(100))INSERT INTO #TESTE (NUMERO,OBS) VALUES (1,'MARIA FOI A FEIRA [22.22.22] E COMPROU [ 22.55.55] ')INSERT INTO #TESTE (NUMERO,OBS) VALUES (2,'[2.10.AA] O ALVO É MOVEL')INSERT INTO #TESTE (NUMERO,OBS) VALUES (3,'[2.10.AC] O ALVO É MOVEL')INSERT INTO #TESTE (NUMERO,OBS) VALUES (4,'[2.10.SA] O ALVO[ED.DE.DE] É MOVEL')INSERT INTO #TESTE (NUMERO,OBS) VALUES (5,'[2.10.VA] O ALVO [11.1.11]É MOVEL')DECLARE @NUMERO INT, @OBS VARCHAR(100)DECLARE MYCURSOR CURSOR FORSELECT NUMERO,OBS FROM #TESTE OPEN MYCURSORFETCH NEXT FROM MYCURSOR INTO @NUMERO,@OBSWHILE @@FETCH_STATUS = 0BEGIN 	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 = 						CONVERT(VARCHAR(10),CODIGO_LIMPO) + ' <-> ' + CONVERT(VARCHAR(10),@AUX) 		WHERE 	NUMERO = @NUMERO		SELECT @OBS = SUBSTRING(@OBS, @POS_FIM + 1, LEN(@OBS))	END	ELSE	BEGIN 		BREAK	ENDENDFETCH NEXT FROM MYCURSOR INTO @NUMERO,@OBSENDCLOSE MYCURSORDEALLOCATE MYCURSORSELECT * FROM #TESTE DROP TABLE #TESTE
O erro estava nesta linha! Não estava concatenando o valor da tabela do CODIGO_LIMPO então o código correto é este:

UPDATE	#TESTE SET CODIGO_LIMPO = CONVERT(VARCHAR(10),CODIGO_LIMPO) + ' <-> ' + CONVERT(VARCHAR(10),@AUX)  WHERE 	NUMERO = @NUMERO

 

Espero que seja isto. Se for até que não foi tão dificil.

 

Coloquei ' <-> ' com separador só mesmo para visualizar o teste. você pode subsituí-lo por que quiser!

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,Testei ante de postar e funfou legal..Posso ter feito caca na hora de postar!!!Vou verificar e posto o código ok.t+

Colei no query e o Código Limpo esta vazio ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

Era na hora de concatenar no campo código_limpo ele tava null por isso não fez certo.

 

Tb viajei usando o convert pq as variavéis já são VACHAR.

 

Código funcionando:

CREATE TABLE #TESTE (NUMERO INT, OBS VARCHAR(100), CODIGO_LIMPO VARCHAR(1000))
INSERT INTO #TESTE (NUMERO,OBS) VALUES (1,'MARIA FOI A FEIRA [22.22.22] E COMPROU [ 22.55.55] ')
INSERT INTO #TESTE (NUMERO,OBS) VALUES (2,'[2.10.AA] O ALVO É MOVEL')
INSERT INTO #TESTE (NUMERO,OBS) VALUES (3,'[2.10.AC] O ALVO É MOVEL')
INSERT INTO #TESTE (NUMERO,OBS) VALUES (4,'[2.10.SA] O ALVO[ED.DE.DE] É MOVEL')
INSERT INTO #TESTE (NUMERO,OBS) VALUES (5,'[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))


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 =
                        ISNULL(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

 

Acho que agora vai.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.