Usuário com melhor resposta
Como buscar informação em uma string

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?
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 RamosMicrosoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Wennder SantosMVP sexta-feira, 16 de maio de 2014 18:17
- Marcado como Resposta Durval RamosModerator sexta-feira, 20 de junho de 2014 02:07
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
-
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.
-
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
-
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.
-
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 RamosMicrosoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Wennder SantosMVP sexta-feira, 16 de maio de 2014 18:17
- Marcado como Resposta Durval RamosModerator sexta-feira, 20 de junho de 2014 02:07