我想在嵌套循環中獲取每個遊標的fetch_status。我無法在這裏使用@@FETCH_STATUS
,因爲嵌套循環(在另一個循環內的循環)對於SQL Server中的fetch_status,值-9意味着什麼?
我的第一種方法是使用[sys.dm_exec_cursors][1]
來確定每個遊標的名稱狀態。然後,如果fetch_status不等於0,我會打破循環。
按照doc the fetch_status應返回以下值:0,-1之一,-2
然而,在我的情況下FETCH_STATUS將返回。 -9是什麼意思?
這裏是我嘗試基於名稱
SET @fetchStatus = (SELECT TOP 1 [fetch_status] FROM sys.dm_exec_cursors (@@SPID | 0) WHERE name = 'pageCursor');
這裏得到光標的狀態是我的存儲過程
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CloneSurvey] @sourceSurveyId INT, @newSurveyName VARCHAR(255)
AS
BEGIN
DECLARE @fetchStatus INT;
If CURSOR_STATUS('global','pageCursor') <> -3
DEALLOCATE pageCursor;
DECLARE pageCursor CURSOR FOR
SELECT
[id]
FROM [survey_pages]
WHERE survey_id = @sourceSurveyId;
DECLARE @lastPageId INT;
DECLARE @pageId INT;
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRAN Survey;
OPEN pageCursor;
WHILE 1 = 1
BEGIN
SET @fetchStatus = (SELECT TOP 1 [fetch_status] FROM sys.dm_exec_cursors (@@SPID | 0) WHERE name = 'pageCursor');
SELECT 'FETCH STAUS => ' + CONVERT(VARCHAR, @fetchStatus);
if @fetchStatus <> 0 AND @fetchStatus <> -9
BREAK;
FETCH NEXT FROM pageCursor
INTO
@pageId
INSERT INTO surveys(page_id)
SELECT @pageId;
@lastPageId = SCOPE_IDENTITY();
EXEC [dbo].[CloneQuestion] @lastPageId
END;
CLOSE pageCursor;
DEALLOCATE pageCursor;
COMMIT TRAN Survey;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF(@@TRANCOUNT > 0)
ROLLBACK TRAN Survey;
END CATCH;
END
不知道,但是[該文檔(https://msdn.microsoft.com/en- us/library/ms190346.aspx)表示這是「最後返回的@@ FETCH_STATUS值」。副手,我想知道如果-9意味着「@@ FETCH_STATUS」從未被訪問或者從未發生過提取。也就是說,一個完全可重現的例子可能會用很長的一段時間來解決它。 – jpmc26
@ jpmc26你可能會在這裏。我用一個簡短的SP版本更新了我的問題。 –