2010-09-29 52 views
4

之前我得到任何好戰光標撲,讓我說,我試圖使用嵌套遊標做一些我只需要做一次,但如果我跑了手術的存儲過程一次爲每個用戶和機構我必須做幾百次。嵌套T-SQL遊標不執行正確

我認爲,在這種情況下,嵌套遊標會救我一些工作,但是當我運行此腳本它通過外光標只有一次,而內部的作品就好了該運行。在測試用例中,外部遊標集由兩行組成,內部遊標集約有五十行。它通過外部遊標的第一行,以及所有五十個內部遊標,然後完成。

正如你所看到的,我節省關外的結果讀取(「@@ FETCH_STATUS」),因此它不會與內干擾光標。

我看不出有什麼問題(顯然)。任何人都可以看到我不能?

declare @fetch_user int 
declare @fetch_agency int 

declare user_cursor cursor for 
select upn from #users 

open user_cursor 

fetch next from user_cursor into @upn 

select @fetch_user = @@fetch_status 

while @fetch_user = 0 
begin 

    declare agency_cursor cursor for 
    select agency, subagency from agency_system where system_id = 1 

    open agency_cursor 

    fetch next from agency_cursor into @agency, @subagency 
    select @fetch_agency = @@fetch_status 

    while @fetch_agency = 0 
    begin 

     select @upn, @agency, @subagency 

     EXEC AddUserToAgencyInRole 
      @upn 
      , @agency 
      , @subagency 
      , @system_id 
      , @role_id 
      , @response output 

     fetch next from agency_cursor into @agency, @subagency 
     select @fetch_agency = @@fetch_status 

    end 

    close agency_cursor 
    deallocate agency_cursor 

    fetch next from user_cursor into @upn 
    select @fetch_user = @@fetch_status 

end 

close user_cursor 
deallocate user_cursor 
+0

eww嵌套遊標。願上帝憐憫你的靈魂。 – RPM1984 2010-09-29 22:23:07

+1

我認爲缺乏@upn的聲明對此並不重要,但卻是無意的發佈漏洞? – 2010-09-29 22:26:51

+0

如果你註釋掉你的內循環,它運行正常嗎? – Beth 2010-09-29 22:36:46

回答

1

我欣賞所有的答覆。

我最終消除了外光標,只是手動運行內之一。這節省了我手動輸入393個單獨的條目。我只需要運行腳本三次。

1

我不知道如何排除嵌套遊標,除此之外,有一種方法可以擺脫它,只有一個遊標。

使用交叉聯接使這個select語句:

SELECT u.upn, a.agency, a.subagency 
FROM #users u, agency_system a 
WHERE a.system_id = 1 

使用它作爲您的遊標定義。它應該具有用戶和代理/次級任務的所有組合。

2

代碼看起來應該起作用。在開始扔在一個計數:

select count(*) from #users 

仔細檢查在#users的行數?

1

我Andomar同意它應該工作。這個測試用例通過外循環4次,內循環每次迭代兩次。 (其與相應表格中的行數匹配)

set nocount on 

DECLARE @upn INT, @agency INT, @subagency INT 

CREATE TABLE #users (upn INT) 

insert into #users select 1 union select 2 UNION select 3 UNION select 4 

CREATE TABLE #agency_system(
agency INT, 
subagency INT, 
system_id INT) 

insert into #agency_system 
select 1,1,1 UNION select 2,2,1 

declare @fetch_user int 
declare @fetch_agency int 

declare user_cursor cursor for 
select upn from #users 

open user_cursor 

fetch next from user_cursor into @upn 
select @fetch_user = @@fetch_status 

while @fetch_user = 0 
begin 
PRINT 'In Outer While Loop' 

    declare agency_cursor cursor for 
    select agency, subagency from #agency_system where system_id = 1 

    open agency_cursor 

    fetch next from agency_cursor into @agency, @subagency 
    select @fetch_agency = @@fetch_status 

    while @fetch_agency = 0 
    begin 
     PRINT 'In Inner While Loop' 

     fetch next from agency_cursor into @agency, @subagency 
     select @fetch_agency = @@fetch_status 
    end 

    close agency_cursor 
    deallocate agency_cursor 

    fetch next from user_cursor into @upn 
    select @fetch_user = @@fetch_status 

end 

close user_cursor 
deallocate user_cursor 

drop TABLE #users 
drop TABLE #agency_system