В приведенном ниже коде содержится одно поле, которое содержит разделительный текст и разбивает его и помещает в смежные поля в зависимости от количества разделителей.Разбиение и обновление строк с использованием динамического SQL внутри курсора
Пример текст с разделителями: OFFR0048 | OFFR0046 | OFFR0044 | OFFR0042 | OFFR0040 | OFFR0038 | OF03993 |
Код работает нормально, однако для его завершения требуется значительное количество времени.
Можно ли выполнить этот процесс более эффективно?
--create procedure variables
declare @CONS varchar(150), @SINGLE varchar(20), @BCC int, @SQLText nvarchar(1000), @Count int
--create cursor
declare String_Split CURSOR for
select ADD_BARCODE from ADD_BARCODES --where (LEN(ADD_BARCODE) - LEN(REPLACE(ADD_BARCODE,'|',''))) >= 7
open String_Split --open cursor
fetch next from String_Split INTO @CONS --set cursor to the first row
WHILE @@FETCH_STATUS = 0 --start procedure
begin
set @BCC = 1 --set the string field to 1
while LEN(@cons) > 0 --start while there are addition codes to split
begin
if CHARINDEX('|',@CONS) > 0 --checks if there are strings to split
begin --begin compound statement 1
set @SINGLE = SUBSTRING(@cons,0,CHARINDEX('|',@CONS)) --use delimiter to split the string
set @SQLText = 'update ADD_BARCODES set ADD_BC' + CAST(@BCC as varchar)+' =
''' + @SINGLE + ''' WHERE CURRENT OF String_Split' --create dynamic query to update relevant string column
exec sp_executesql @SQLText --execute dynamic query
set @BCC = @BCC + 1 --increment string field with 1
set @CONS = SUBSTRING(@CONS, LEN(@SINGLE + '|') + 1,len(@CONS)) --set the remaining string to the @cons varianble for further processing
end --end compound statement 1
else --if there are not strings to split
begin --begin compound statement 2
set @SINGLE = @CONS --set @cons variable equal to the @single variable
set @CONS = null --execute dynamic query
set @SQLText = 'update ADD_BARCODES set ADD_BC' + CAST(@BCC as varchar)+' =
''' + @SINGLE + ''' WHERE CURRENT OF String_Split' --create dynamic query to update relevant string column
exec sp_executesql @SQLText --execute dynamic query
end --end compound statement 2
end --end while there are addition codes to split
fetch next from String_Split INTO @CONS --fetch next entry in cursor
end --end procedure
close String_Split --close cursor
deallocate String_Split --deallocate cursor memory