Update SQL

Olá,

Estamos mudando o servidor de banco e de aplicação aqui da empresa e temos o seguinte problema:

Nossa aplicação salva algumas páginas no banco de dados, em html mesmo.
Em alguns registros existem links que apontam para o endereço do servidor antigo.
Eu preciso alterar todos estes links para direcioná-los ao servidor novo.

É possível via SQL eu alterar somente este endereço?

Por exemplo:

lá no banco eu tenho

a href=“http://nome_do_servidor/index.jsp”

eu preciso alterar o registro para ele ficar assim

a href=“http://nome_do_servidor_novo/index.jsp”

Eu creio que a resposta seja negativa e que minha saída seja criar uma aplicação para fazer isso, mas não sou tão experiente assim com sql e gostaria da opinião de vocês…

Obrigado.

Boa tarde

Você conseguirá fazer isso dependendo do banco de dados que você usa. Alguns bugs são conhecidos em bancos como o Sybase e SQLServer (até o 7) com campos text (blob e clob). Qual é o banco que você está usando?

Estou usando SQL server 2000
e o campo é ntext

Faça o seguinte:


declare @reg integer,   -- Codigo do registro que esta sendo utilizado no momento
           @pos integer,  -- Posicao do texto antigo na coluna da sua tabela
           @valant varchar(255),  -- Valor anterior (que você quer substituir)
           @valnovo varchar(255) -- Novo valor que você irá inserir

select @reg = 0, @valant = 'ENDERECO ANTERIOR', @valnovo = 'ENDERECO NOVO'

-- while que percorre todos os registros para trocar o codigo
while(1=1) -- Nao funciona apenas 1
begin
   -- Seleciona sempre o registro com o menor codigo
   select @reg = min(PK_DA_TABELA) from TABELA where PK_DA_TABELA > @reg

   -- Caso nao encontre sai do loop
   if(@reg=null) 
      break

   -- While que procura 'n' vezes o texto no registro
   while(1=1) 
   begin
      -- Seleciona onde comeca o texto antigo
      select @pos = charindex(COLUNA_TEXTO, @valant)

      -- Caso nao encontre nenhuma string no registro
      if(@pos<=0)
         break

      -- Atualiza essa parte do registro
      update COLUNA_TEXTO = substring(COLUA_TEXTO, 0, @pos) + @valnovo + substring(COLUNA_TEXTO, @pos + datalength(@valnovo),datalength(COLUNA_TEXTO))
   end
end

Com isso deve funcionar (não esqueça de rodar antes em uma base de testes).

O tipo ntext é inválido para a função charindex?

existe algum tipo de dado que eu possa substituir que funcione com essa função ou outra função semelhante que permita utilização de ntext?

Obrigado pela ajuda.

Talvez funcione com o TEXT ou senão só varchar.

Replace não funciona?

UPDATE TABELA SET CAMPO = REPLACE(CAMPO,‘SERVIDOR’,‘SERVIDOR_NOVO’)

Aqui faltou um from TABELA correto?

Sem o from tava dando erro de coluna não encontrada.

No entanto esse charindex está retornando 0 mesmo quando a string existe...

Aqui faltou um from TABELA correto?

Sem o from tava dando erro de coluna não encontrada.

No entanto esse charindex está retornando 0 mesmo quando a string existe…

ops… faltou sim. Use da seguinte forma:

select @pos = charindex(@valant,COLUNA_TEXTO)   from TABELA where PK_DA_TABELA = @reg

Note que eu inverti a ordem do @valant e do COLUNA_TEXTO.

Eu tô achando que esse negócio tá dando loop infinito, apesar da lógica parecer estar correta…

Tenho 300 registros na tabela somente e o script roda por mais de 15 minutos sem finalizar

Obrigado

Pode ser… vale a pena você colocar um print em cada iteracao com o @reg (não esqueca de converter para varchar). Também coloque uma condicao de se chegar a 5 registros da um break.

Olá,

Consegui resolver de outra maneira:

Obrigado pela ajuda.
:slight_smile: