Como substituir uma seqüência de caracteres em uma coluna da tabela do SQL Server

364

Eu tenho uma tabela ( SQL Sever) que faz referência a caminhos ( UNCou não), mas agora o caminho vai mudar.

Na coluna do caminho, tenho muitos registros e preciso alterar apenas uma parte do caminho, mas não o caminho inteiro. E preciso mudar a mesma string para a nova, em todos os registros.

Como posso fazer isso com um simples update?

Iralda Mitro
fonte

Respostas:

604

É fácil assim:

update my_table
set path = replace(path, 'oldstring', 'newstring')
cjk
fonte
43
Eu normalmente adicionaria where path like '%oldstring%'se houvesse muitos dados.
Derek Tomes
11
onde condição faz sentido, porque se eu tiver 50 linhas na tabela e se estiver substituindo 10 linhas pela função de substituição, ela afetará todas as 50 linhas, mesmo que substitua 10 linhas se você não tiver condição onde. Mas se você tiver onde a condição mencionada acima comenta, ela afeta apenas 10 linhas.
IMalek
132
UPDATE [table]
SET [column] = REPLACE([column], '/foo/', '/bar/')
Marc Gravell
fonte
11
desculpe, para não ser nitpicky depois de dez anos, mas não está claro a partir da resposta se fooestá sendo substituído ou bar (desculpe novamente)
Alex
28

Eu tentei o acima, mas não produziu o resultado correto. O seguinte faz:

update table
set path = replace(path, 'oldstring', 'newstring') where path = 'oldstring'
César
fonte
11
Isso anula totalmente o objetivo de usar o método de substituição. Você pode fazer o mesmo: atualizar o conjunto de tabelas path = 'newstring' where path = 'oldstring';
31316 Ian
11
talvez você quis dizer where path like '%oldstring%'?
precisa saber é o seguinte
17
UPDATE CustomReports_Ta
SET vchFilter = REPLACE(CAST(vchFilter AS nvarchar(max)), '\\Ingl-report\Templates', 'C:\Customer_Templates')
where CAST(vchFilter AS nvarchar(max)) LIKE '%\\Ingl-report\Templates%'

Sem a CASTfunção, recebi um erro

O tipo de dados do argumento ntexté inválido para o argumento 1 da replacefunção.

Igor Bakay
fonte
9

Você pode usar esta consulta

update table_name set column_name = replace (column_name , 'oldstring' ,'newstring') where column_name like 'oldstring%'
Nitika Chopra
fonte
8

todas as respostas são ótimas, mas eu só quero dar um bom exemplo

select replace('this value from table', 'table',  'table but updated')

essa instrução SQL substituirá a existência da palavra "tabela" (segundo parâmetro) dentro da instrução fornecida (primeiro parâmetro) pelo terceiro parâmetro

o valor inicial é, this value from tablemas depois de executar a função de substituição, seráthis value from table but updated

e aqui está um exemplo real

UPDATE publication
SET doi = replace(doi, '10.7440/perifrasis', '10.25025/perifrasis')
WHERE doi like '10.7440/perifrasis%'

por exemplo, se tivermos esse valor

10.7440/perifrasis.2010.1.issue-1

se tornará

10.25025/perifrasis.2010.1.issue-1

espero que isso lhe dê uma melhor visualização

Basheer AL-MOMANI
fonte
6
select replace(ImagePath, '~/', '../') as NewImagePath from tblMyTable 

onde "ImagePath" é o nome da minha coluna.
"NewImagePath" é a coluna temporária Nome da instância de "ImagePath"
"~ /" é minha string atual. (String antiga)
"../" é minha string solicitada. (Nova string)
"tblMyTable" é minha tabela no banco de dados.

Durgesh Pandey
fonte
4

Se o tipo de coluna de destino for diferente de varchar / nvarchar como texto , precisamos converter o valor da coluna como string e depois convertê-lo como:

update URL_TABLE
set Parameters = REPLACE ( cast(Parameters as varchar(max)), 'india', 'bharat')
where URL_ID='150721_013359670'
khichar.anil
fonte
2

você precisa substituir o caminho com a ajuda da função de substituição.

update table_name set column_name = replace(column_name, 'oldstring', 'newstring')

aqui column_namese refere à coluna que você deseja alterar.

Espero que funcione.


fonte
0

Você também pode substituir texto grande por modelo de email em tempo de execução. Aqui está um exemplo simples para isso.

DECLARE @xml NVARCHAR(MAX)
SET @xml = CAST((SELECT [column] AS 'td','',        
        ,[StartDate] AS 'td'
         FROM [table] 
         FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))
select REPLACE((EmailTemplate), '[@xml]', @xml) as Newtemplate 
FROM [dbo].[template] where id = 1
Shekhar Patel
fonte