За изпълнението на тази задача ще са необходими t-sql функция и курсор. fn_SplitList ще ви позволи да разделите въз основа на разделител. След като имате тази функция, можете да създадете курсор, който да се движи срещу вашите данни, актуализирайки всеки запис. Създадох пример с помощта на @table1.
Функция
CREATE FUNCTION [dbo].[fn_SplitList]
(
@RowData varchar(8000),
@SplitOn varchar(5)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Data varchar(100)
)
AS
BEGIN
Declare @Cnt int
Set @Cnt = 1
While (Charindex(@SplitOn,@RowData)>0)
Begin
Insert Into @RtnValue (data)
Select
Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
Set @Cnt = @Cnt + 1
End
Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))
Return
END
Код за извършване на актуализация
declare @table1 table(id int primary key
,words varchar(max))
declare @id int
declare @words varchar(max)
insert into @table1 values(0, 'word1, word2, , word3, word4')
insert into @table1 values(1, 'word1, word2, word3, ,')
insert into @table1 values(2, 'word1,,,, ; word2')
insert into @table1 values(3, ';word1 word2, word3')
declare updateCursor cursor for
select id
,words
from @table1
open updateCursor
fetch next from updateCursor into @id, @words
while @@fetch_status = 0
begin
declare @row varchar(255)
select @row = coalesce(@row+', ', '') + data
from dbo.fn_SplitList(@words, ',')
order by id desc
update @table1
set words = @row
where id = @id
fetch next from updateCursor into @id, @words
end
close updateCursor
deallocate updateCursor
select *
from @table1