इस कार्य को पूरा करने के लिए एक टी-एसक्यूएल फ़ंक्शन और एक कर्सर की आवश्यकता होगी। 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