值-9对于SQL Server中的fetch_状态意味着什么?
我试图获取嵌套循环中每个游标的fetch_状态。我无法在此处使用@@FETCH\u状态,因为另一个循环中有嵌套的循环 我的第一种方法是使用[sys.dm_exec_cursors][1]通过名称确定每个游标的状态。然后,如果fetch_状态不等于0,我将中断循环 根据,应返回以下值之一0,-1,-2 但是,在我的例子中,fetch_状态返回-9。9是什么意思 下面是我如何根据名称获取光标的状态值-9对于SQL Server中的fetch_状态意味着什么?,sql,sql-server,Sql,Sql Server,我试图获取嵌套循环中每个游标的fetch_状态。我无法在此处使用@@FETCH\u状态,因为另一个循环中有嵌套的循环 我的第一种方法是使用[sys.dm_exec_cursors][1]通过名称确定每个游标的状态。然后,如果fetch_状态不等于0,我将中断循环 根据,应返回以下值之一0,-1,-2 但是,在我的例子中,fetch_状态返回-9。9是什么意思 下面是我如何根据名称获取光标的状态 SET @fetchStatus = (SELECT TOP 1 [fetch_status] FR
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
根据,fetch\u status列存储最后返回的@@fetch\u状态。这意味着在对游标执行第一次获取之前,fetch_状态是未定义的,并且似乎使用-9对其进行编码。下面的示例确实向SQL Server 2012显示,在调用第一次提取之前,值为-9:
DECLARE cur1 CURSOR LOCAL
FOR
SELECT 1
OPEN cur1
--fetch_status = -9
SELECT fetch_status
FROM sys.dm_exec_cursors(@@SPID)
WHERE name = 'cur1'
FETCH NEXT FROM cur1;
--fetch_status=0
SELECT fetch_status
FROM sys.dm_exec_cursors(@@SPID)
WHERE name = 'cur1'
不知道,但假设这是最后一个返回的@@FETCH\u状态值。现在,我想知道-9是否表示从未访问过@@FETCH\u状态,或者是否从未进行过提取。这就是说,一个完全可复制的例子可能会对解决这个问题大有帮助。@jpmc26您可能在这里找到了一些东西。我用我的SP的简短版本更新了我的问题。事实上,这是正确的答案。我希望文件能说明这一点,它似乎只是解释了0,-1,-2