none
Como buscar informação em uma string RRS feed

  • Pergunta

  • Bom dia

    Pessoal estou com realizando um procedimento no banco de dados onde houve à necessidade de reinserir os dados de uma tabela conclusão eu vou precisar uma outra tabela porém me deparei com o erro abaixo:

    Eu tenho uma tabela chamada itensvenda, nela eu tenho um campo chamado lotes onde essa armazena à seguinte informação:

    154198|01/09/2015|2@205809|01/09/2015|1@205811|30/10/2015|

    Onde à primeira coluna antes do pipe é o código que eu preciso atualizar, alguem saberia me dizer como eu poderia atualizar essa informação?

    A tabela que sofreu alteração é a tabela lotes que tem um campo código e que é a informação que eu preciso atualizar e também tem o campo codigoantigo que é a informação encontrada na string, eu preciso então encontrar o código na string conforme havia citado anteriormente vincular ao código antigo que e por sua vez atualizar pelo campo código tem alguma ideia?

    quinta-feira, 15 de maio de 2014 14:15

Respostas

  • Eder,

    Segue abaixo uma função que separa os dados de uma determinada string em colunas e com isto você poderá atualizar às informações e posteriormente concatenar os novos dados para atualizar na sua tabela.

    CREATE FUNCTION DBO.FN_SEPARA_COLUNAS
    (@TEXTO VARCHAR(8000)
    ,@NR_COLUNA TINYINT
    ,@SEPARADOR CHAR(1)
    )RETURNS VARCHAR(8000)
    AS BEGIN
    DECLARE @INICIO INT
    DECLARE @FIM INT
    SET @INICIO=1
    SET @FIM=CHARINDEX(@SEPARADOR,@TEXTO,@INICIO)
    
    WHILE (@NR_COLUNA>1 AND @FIM>0)
    BEGIN
    	SET @INICIO = @FIM + 1
    	SET @FIM = CHARINDEX(@SEPARADOR,@TEXTO,@INICIO)
    	SET @NR_COLUNA = @NR_COLUNA - 1
    END
    
    IF @NR_COLUNA > 1 SET @INICIO = LEN(@TEXTO) + 1
    IF @FIM = 0 SET @FIM = LEN(@TEXTO) + 1
    RETURN SUBSTRING(@TEXTO, @INICIO, @FIM - @INICIO)
    END
    GO

    Veja abaixo um exemplo:

    DECLARE @CD_LOTE int
    DECLARE @DT_LOTE date
    DECLARE @CD_ANTIGOLOTE varchar(15)
    
    SELECT 
    @CD_LOTE = DBO.FN_SEPARA_COLUNAS('154198|01/09/2015|2@205809|01/09/2015|1@205811|30/10/2015|',1,'|'),
    @DT_LOTE = CAST(DBO.FN_SEPARA_COLUNAS('154198|01/09/2015|2@205809|01/09/2015|1@205811|30/10/2015|',2,'|') AS DATE),
    @CD_ANTIGOLOTE = DBO.FN_SEPARA_COLUNAS('154198|01/09/2015|2@205809|01/09/2015|1@205811|30/10/2015|',3,'|')
    
    --COM ESTAS VARIÁVEIS, VOCÊ PODE CONSTRUIR UMA 
    --PROCEDURE PARA ATUALIZAR OS DADOS NA TABELA
    SELECT @CD_LOTE, @DT_LOTE, @CD_ANTIGOLOTE
    
    --PARA CONCATENAR, NÃO ESQUEÇA DE CONVERTER PARA "VARCHAR"
    SELECT CONVERT(VARCHAR, @CD_LOTE) + '|' + CONVERT(VARCHAR, @DT_LOTE, 101) 
    + '|' + CONVERT(VARCHAR, @CD_ANTIGOLOTE)

    Segue também a evidência de teste do funcionamento da função:

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    sexta-feira, 16 de maio de 2014 13:07
    Moderador

Todas as Respostas

  • Cara não entendi muito bem o que vc quer mas já que esta tentando fazer uma pesquisa na string que seria o valor do seu campo vc poderia usar 

    SELECT * FROM table WHERE CONTAINS(Column, 'test');


    Nome : Romy G. Moura Cargo: Analista Programador

    quinta-feira, 15 de maio de 2014 14:23
  • Deu o erro abaixo:

    Cannot use a CONTAINS or FREETEXT predicate on table or indexed view 'itensvenda' because it is not full-text indexed.

    Executei o seguinte comando:

    SELECT * FROM itensvenda
     WHERE CONTAINS(LOTES, '154198')
       AND CHARINDEX('@',LOTES) > 0

    Vou tentar explicar melhor:

    Eu tenho à tabela lotes com à seguinte estrutura:

    Codigo integer

    Codigoantigo integer

    Eu tenho uma tablea itensvenda com à seguinte estrutura:

    Codigo integer

    Lotes Varchar(5000)

    Agora eu tenho seguinte cenário :

    Tabela Lotes:

    Código     Codigoantigo

    1000        205809

    Tabela Itensvenda

    Codigo     Lotes

    5              154198|01/09/2015|2@205809|01/09/2015|1@205811|30/10/2015|

    O que ocorre é que na tabela de vendas esta desatualizada eu preciso pegar à string do campo lotes varrer ela atrás da informação contida na tabela de lotes no campo codigoantigo e quando encontrar eu preciso substituir essa informação do codigoantigo pela informação contida no codigo, porém no caso acima eu tenho três códigos à atualizar visto que à primeira informação antes do primeiro pipe é o codigo que preciso procurar.

    quinta-feira, 15 de maio de 2014 14:43
  • Clique com o direito em cima da tabela pelo sql manager depois no menu full text index ai é só seguir as instruções que a ferramenta vai dando.

    Exemplo clique

    Faça isso e tente novamente!


    Nome : Romy G. Moura Cargo: Analista Programador


    • Editado Romy Moura quinta-feira, 15 de maio de 2014 18:54
    quinta-feira, 15 de maio de 2014 17:44
  • Olá Eder,

    você vai conseguir fazer isso utilizando as funções substring (seleciona determinada parte de um texto) e charindex (retorna a posição da primeira ocorrência de um char dentro do texto). Fiz um exemplo aqui seguindo a sua necessidade e funcionou certinho, veja e adapte para você:

    update itensvenda

    set lotes = 'Coloque aqui o codigo novo' + (select substring(lotes, charindex('|', lotes), len(lotes))

    from itensvendas where codigo = 'codigo do registro que vc quer alterar')

    where codigo = 'codigo do registro que vc quer alterar'



    Wennder Santos

    Se solucionou seu problema ou dúvida, não esqueça de marcar como resposta. Se foi util, não esqueça de marcar como util.

    quinta-feira, 15 de maio de 2014 18:35
  • Eder,

    Segue abaixo uma função que separa os dados de uma determinada string em colunas e com isto você poderá atualizar às informações e posteriormente concatenar os novos dados para atualizar na sua tabela.

    CREATE FUNCTION DBO.FN_SEPARA_COLUNAS
    (@TEXTO VARCHAR(8000)
    ,@NR_COLUNA TINYINT
    ,@SEPARADOR CHAR(1)
    )RETURNS VARCHAR(8000)
    AS BEGIN
    DECLARE @INICIO INT
    DECLARE @FIM INT
    SET @INICIO=1
    SET @FIM=CHARINDEX(@SEPARADOR,@TEXTO,@INICIO)
    
    WHILE (@NR_COLUNA>1 AND @FIM>0)
    BEGIN
    	SET @INICIO = @FIM + 1
    	SET @FIM = CHARINDEX(@SEPARADOR,@TEXTO,@INICIO)
    	SET @NR_COLUNA = @NR_COLUNA - 1
    END
    
    IF @NR_COLUNA > 1 SET @INICIO = LEN(@TEXTO) + 1
    IF @FIM = 0 SET @FIM = LEN(@TEXTO) + 1
    RETURN SUBSTRING(@TEXTO, @INICIO, @FIM - @INICIO)
    END
    GO

    Veja abaixo um exemplo:

    DECLARE @CD_LOTE int
    DECLARE @DT_LOTE date
    DECLARE @CD_ANTIGOLOTE varchar(15)
    
    SELECT 
    @CD_LOTE = DBO.FN_SEPARA_COLUNAS('154198|01/09/2015|2@205809|01/09/2015|1@205811|30/10/2015|',1,'|'),
    @DT_LOTE = CAST(DBO.FN_SEPARA_COLUNAS('154198|01/09/2015|2@205809|01/09/2015|1@205811|30/10/2015|',2,'|') AS DATE),
    @CD_ANTIGOLOTE = DBO.FN_SEPARA_COLUNAS('154198|01/09/2015|2@205809|01/09/2015|1@205811|30/10/2015|',3,'|')
    
    --COM ESTAS VARIÁVEIS, VOCÊ PODE CONSTRUIR UMA 
    --PROCEDURE PARA ATUALIZAR OS DADOS NA TABELA
    SELECT @CD_LOTE, @DT_LOTE, @CD_ANTIGOLOTE
    
    --PARA CONCATENAR, NÃO ESQUEÇA DE CONVERTER PARA "VARCHAR"
    SELECT CONVERT(VARCHAR, @CD_LOTE) + '|' + CONVERT(VARCHAR, @DT_LOTE, 101) 
    + '|' + CONVERT(VARCHAR, @CD_ANTIGOLOTE)

    Segue também a evidência de teste do funcionamento da função:

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    sexta-feira, 16 de maio de 2014 13:07
    Moderador