Sql-Server

游標從不停止

  • January 23, 2019

我似乎在這個游標中犯了一個錯誤,我似乎無法弄清楚我做錯了什麼。

我已經確認select拉回了 2 行。但是當我將它傳遞給游標以選擇出現的字元串時,我可以提取我需要的確切值。這兩行看起來像下面這樣……

|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|

游標似乎抓住了第一行並不斷循環,永遠不會進入下一行或結束程序。

declare
   @clobstringP varchar(max),
   @clobstring  varchar(max);

declare SevenCursor cursor for 
   select [value] as ClobP
   from string_split(@clobstring, '>')
   where value like '%<|2|%';

open SevenCursor;
fetch next from SevenCursor into @clobstringP;

while @@FETCH_STATUS = 0
begin
   insert into [database].dbo.tablestuff ( ValueP ) 
   select file387
   from ( 
       select 
            RowId387 = row_number() over( order by ( select 1 ) )
           ,file387  = [value]
       from string_split(@clobstringP, '|')
   ) a
   where a.RowId387 = 6;

end;

close SevenCursor;
deallocate SevenCursor;

有人可以指出我正確的方向嗎?

正如彼得指出的那樣,您的循環永遠不會結束,因為您沒有在循環內執行 fetch。我更喜歡只維護一個 FETCH 而不是兩個。所以,我的游標循環結構如下:

WHILE 1 = 1
BEGIN
 FETCH NEXT FROM OrdersCursor INTO @sales_person_id, @orderdate;
   IF @@FETCH_STATUS <> 0
     BREAK

 --Whatever it is I'm doing inside the loop
END

你喜歡的口味問題…

游標將無限循環,除非和直到@@fetchstatus = 0。為了達到該狀態,您需要繼續瀏覽數據集。為此,您應該添加fetch next from SevenCursor into @clobstringP;到塊的內部begin ... end以便游標可以迭代。


在此階段進行一些編輯可能是謹慎的做法,並建議您嘗試完全放棄游標。游標非常漂亮,但經常被誤用;從您提供的虛擬碼來看,您可能正在嘗試修復X何時可以繞過Y.

我可能會建議將整個結果集string_split放入一個明智的#temp_table. 當您對此記憶體結果集執行任何必要的更新/刪除並驗證它是否合適時,請根據批量評估規則嘗試單個成功或失敗。 insert into dbo.tablestuff ...例如:

declare @pipe_delimited_rows table ( 
   my_row varchar(max)
);
insert @pipe_delimited_rows ( my_row ) 
values 
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|'),
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|');

drop table if exists #cache_results; 
create table #cache_results ( 
    id int identity not null primary key
   ,ClobP nvarchar(max)
); 

insert #cache_results ( ClobP )
select ss.[value] as ClobP
from @pipe_delimited_rows pdr
cross apply string_split(pdr.my_row, '>') ss -- delimiting appropriately here, of course
where ss.[value] like '%<|2|%';

/* perform business logic to validate interim results here */

insert into [database].dbo.tablestuff ( ValueP ) 
select ClobP
from #cache_results;

免責聲明

引用自:https://dba.stackexchange.com/questions/227854