SQL Server游标使用报错:Msg 16916,游标ShowSDFinfo不存在
解决游标名称拼写不一致导致的Msg 16916错误
你遇到的Msg 16916错误完全是游标名称拼写不一致导致的——仔细核对你的代码就能发现问题:
在声明游标时,你定义的名称是ShowSFDinfo(字母顺序为S-F-D):
DECLARE ShowSFDinfo CURSOR STATIC LOCAL READ_ONLY FOR ...
但在后续的OPEN、FETCH、CLOSE和DEALLOCATE操作里,你全都写成了ShowSDFinfo(字母顺序为S-D-F)。SQL Server找不到名称为ShowSDFinfo的游标,所以反复抛出“游标不存在”的错误。
修正后的完整代码
只需要把所有游标名称统一成一致的拼写即可,这里我将所有操作的游标名对齐为声明时的ShowSFDinfo(你也可以统一改成ShowSDFinfo,只要全程保持一致就行):
CREATE OR ALTER PROCEDURE testload AS BEGIN SET NOCOUNT ON; DECLARE @VantiveOrgID1 VARCHAR(12), @VantiveCustomerName1 VARCHAR(12), @Sector1 VARCHAR(12) --DECLARE AND SET COUNTER. DECLARE @Counter INT SET @Counter = 1 --DECLARE THE CURSOR FOR A QUERY. DECLARE ShowSFDinfo CURSOR STATIC LOCAL READ_ONLY FOR SELECT [Vantive OrgID], [Vantive Customer Name], [Sector] FROM [dbo].[SCASalesOrderExport_20180416] WITH (nolock) WHERE date >= '1/1/18' ORDER BY date DESC; --OPEN CURSOR. OPEN ShowSFDinfo; --FETCH THE RECORD INTO THE VARIABLES. FETCH NEXT FROM ShowSFDinfo INTO @VantiveOrgID1, @VantiveCustomerName1, @Sector1 --LOOP UNTIL RECORDS ARE AVAILABLE. WHILE @@FETCH_STATUS = 0 BEGIN IF @Counter = 1 BEGIN SELECT @@CURSOR_ROWS END FETCH NEXT FROM ShowSFDinfo INTO @VantiveOrgID1 ,@VantiveCustomerName1 ,@Sector1 END CLOSE ShowSFDinfo DEALLOCATE ShowSFDinfo END
额外小贴士
- 编写游标时,建议使用统一的命名规范,或者把游标名称定义为变量,减少手动拼写错误的概率
- 你已经使用了
LOCAL游标,它的作用域仅限于当前存储过程,不会和其他会话的游标产生命名冲突,这是个很好的实践
内容的提问来源于stack exchange,提问作者Arjun R
相关产品推荐
相关产品推荐

