For at udføre denne opgave kræver det en t-sql-funktion og en markør. fn_SplitList giver dig mulighed for at opdele baseret på en afgrænser. Når du har denne funktion, kan du oprette en markør til at køre mod dine data ved at opdatere hver post. Jeg oprettede et eksempel ved hjælp af @table1.
Funktion
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
Kode til at udføre opdatering
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