Sql-Server
游標從不停止
我似乎在這個游標中犯了一個錯誤,我似乎無法弄清楚我做錯了什麼。
我已經確認
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;
免責聲明
- 範例虛擬碼不會按原樣正常執行。我有點從你的 OP rev 1 開始修補。您當然需要在正確的分隔符上進行定界,並對您的實時數據集執行適當的轉換。
- 值得注意的是,目前沒有辦法在string_split中強制執行元素順序。