home


Search and replace in text columns
Author Nigel Rivett

This code will replace all occurrances of a string in a text column in all rows  


this uses the following table to test

Create table test (i int, j int, t text)
go
create unique index ix on test
	(i, j)
go

it can be populated with test data as follows using the nr_AddTextRec stored procedure in this site

delete test
exec nr_AddTextRec 1, 1, 'asadf', 'I'
exec nr_AddTextRec 1, 1, 'jjjjj', 'A'
exec nr_AddTextRec 1, 1, 'kkkkksadf', 'A'
declare @t varchar(8000)
select @t = space(6000) + 'sadf'
exec nr_AddTextRec 1, 1, @t, 'A'
select @t = 'sadf'
exec nr_AddTextRec 1, 1, @t, 'A'
select @t = space(6000) + 'sadf'
exec nr_AddTextRec 1, 1, @t, 'A'
select @t = 'sadf'
exec nr_AddTextRec 1, 1, @t, 'A'

exec nr_AddTextRec 1, 2, 'asadf', 'I'
exec nr_AddTextRec 1, 2, 'jjjjj', 'A'
exec nr_AddTextRec 1, 2, 'kkkkksadf', 'A'
--declare @t varchar(8000)
select @t = space(6000) + 'sadf'
exec nr_AddTextRec 1, 2, @t, 'A'
select @t = 'sadf'
exec nr_AddTextRec 1, 2, @t, 'A'
select @t = space(6000) + 'sadf'
exec nr_AddTextRec 1, 2, @t, 'A'
select @t = 'sadf'
exec nr_AddTextRec 1, 2, @t, 'A'



The code to replace all occurrances of the following string in a column in all rows  



declare	@old varchar(20) ,
	@new varchar(20)
select 	@old = 'adf' ,
	@new = 'qsd'	
	
-- pk for table
declare @i int ,
	@j int

declare @ptr binary(16) ,
	@offset int ,
	@dellen int
	
	select @dellen = len(@old)
	
	select @ptr = 0
	while @ptr is not null
	begin
		select @ptr = null
		select 	top 1 @i = i, @j = j, @ptr = textptr(t) 
		from	test
		where t like '%' + @old + '%'
		
		if @ptr is not null
		begin
			select @offset = 1
			while @offset <> 0
			begin
				select @offset = patindex('%' + @old + '%', t) from test where i = @i and j = @j
				select offset = @offset
				if @offset > 0
				begin
					select @offset = @offset-1
					updatetext test.t @ptr @offset @dellen @new
				end	
			end
		end
	end


home