Update SQL

11 respostas
ACDias

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.

11 Respostas

W

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?

ACDias

Estou usando SQL server 2000
e o campo é ntext

W

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).

ACDias

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.

W

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

spycall

Replace não funciona?

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

ACDias
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…

W

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.

ACDias

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

W

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.

ACDias

Olá,

Consegui resolver de outra maneira:

Obrigado pela ajuda.
:slight_smile:

Criado 19 de março de 2008
Ultima resposta 24 de mar. de 2008
Respostas 11
Participantes 3