【发布时间】:2016-03-29 06:48:51
【问题描述】:
我正在尝试获取嵌套循环中每个游标的 fetch_status。由于嵌套循环(在另一个循环中循环),我无法在此处使用@@FETCH_STATUS
我的第一种方法是使用[sys.dm_exec_cursors][1] 通过名称来确定每个游标的状态。然后如果 fetch_status 不等于 0 我会打破循环。
根据doc the fetch_status应该返回以下值之一:0、-1、-2
但是,在我的例子中,fetch_status 返回-9。 -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
【问题讨论】:
-
不知道,但the docs 说这是“最后返回的
@@FETCH_STATUS值”。顺便说一句,我想知道 -9 是否意味着从未访问过@@FETCH_STATUS或者从未发生过提取。也就是说,一个完全可重复的示例可能会在很长的道路上解决它。 -
@jpmc26 你可能在这里有所收获。我用简短版本的 SP 更新了我的问题。
标签: sql sql-server