2016-03-03 57 views
0

由於基於數據的父 - 子關係的存儲過程的嵌套,我聲明瞭一個動態光標,該關係可以轉到多個級別,並在處理時每天變化。該存儲的過程適用於父調用,但此過程的子數據過程會導致一條消息,指出「光標未打開」。此消息發生在檢查後確保遊標處於打開狀態的Fetch處。SQL Server - 光標錯誤

DECLARE @OutCur CURSOR; 
DECLARE @curName as NVARCHAR(MAX); 
... 
SET @curName = LEFT(replace(replace(CONVERT (time, GETDATE()),':',''),'.',''),8); 
SET @sqlCommand = 'SELECT a.myfields FROM mytable a;    
SET @sqlCommand = 'SET @cursor' + @curName + ' = CURSOR LOCAL FAST_FORWARD FOR ' + @sqlCommand + ' OPEN @cursor' + @curName + ';' 

SET @curName = '@cursor' + @curName + ' cursor output'; 

EXEC sys.sp_executesql @sqlCommand,@curName,@OutCur output 
IF CURSOR_STATUS('global','@OutCur')=-1 
    OPEN @OutCur; 
FETCH NEXT FROM @OutCur INTO @name,@type 

在此先感謝您的意見。

+0

細說什麼是「慣例」,以及他們如何溝通。你的遊標在嵌套過程中聲明瞭嗎? –

+0

你真的需要光標嗎?大多數情況下,人們在不應該使用遊標的時候,因爲他們不熟悉如何在基於集合的操作中執行相同的操作。也許如果你能分享你的實際邏輯,我們可以完全擺脫光標。 –

+0

@SeanLange您對此方案有默認的剪切/粘貼響應嗎? ;) – Lankymart

回答

0

,如果你取消註釋接近+ DEALLOCATE - 腳本正常工作:

GO 

DECLARE @OutCur CURSOR; 
DECLARE @curName as NVARCHAR(MAX), @sqlCommand nvarchar(max), @name varchar(100), @type varchar(100) 
declare @i int = 0 

while @i < 5 
begin 

    SET @curName = LEFT(replace(replace(CONVERT (time, GETDATE()),':',''),'.',''),8); 
    SET @sqlCommand = 'SELECT ''111'' as name, ''cc'' as type; ' 
    SET @sqlCommand = 'SET @cursor' + @curName + ' = CURSOR LOCAL FAST_FORWARD FOR ' + @sqlCommand + ' OPEN @cursor' + @curName + ';' 

    SET @curName = '@cursor' + @curName + ' cursor output'; 

    EXEC sys.sp_executesql @sqlCommand,@curName,@OutCur output 

    FETCH NEXT FROM @OutCur INTO @name,@type 
    select @name, @type 

    --close @OutCur 
    --deallocate @OutCur 

    set @i += 1 
end 
GO 
+0

由於遊標不是所需的方法和令人頭疼的問題,我已經用#temp表進行了另一條路線。謝謝大家 – Galactic