使用@或不使用@声明游标之类的变量的区别

Difference declaring cursor like variable with @ or not

我遇到了一个找不到答案的问题:

在SQL服务器中,

有什么区别
DECLARE CRS_RQS INSENSITIVE CURSOR FOR
    SELECT pRqsMtr FROM dtRqsMtr
    WHERE pRqs = @pRqs
OPEN CRS_RQS
FETCH NEXT FROM CRS_RQS INTO @pRqsMtr
WHILE (@@Fetch_Status = 0) AND (@@Error = 0)
BEGIN

    -- do some stuff...
    FETCH NEXT FROM CRS_RQS INTO @pRqsMtr
END 
CLOSE CRS_RQS
DEALLOCATE CRS_RQS

还有这个?

DECLARE @CRS_RQS CURSOR
SET @CRS_RQS = VOID
SET @CRS_RQS = CURSOR FOR
    SELECT pRqsMtr FROM dtRqsMtr
    WHERE pRqs = @pRqs
OPEN @CRS_RQS
FETCH NEXT FROM @CRS_RQS INTO @pRqsMtr
WHILE (@@Fetch_Status = 0) AND (@@Error = 0)
BEGIN

    -- do some stuff...
    FETCH NEXT FROM @CRS_RQS INTO @pRqsMtr
END 
CLOSE @CRS_RQS
DEALLOCATE @CRS_RQS

还有..以上两个中最好的是什么?

提前致谢

如果您确定确实需要游标(这往往是错误的选择),最好是 @CRS_RQS,因为:

  • 它会自动从“普通”游标中删除一些较重的默认选项;并且,
  • 你不必 close/declare;它会自动执行此操作。

查看 Itzik Ben-Gan 的 post 关于他切换到局部游标变量的原因:

并查看我对用于“真实”游标的最佳选项的一些性能研究:

最重要的一点是使用 LOCAL FAST_FORWARD 除非你知道你需要不同的选项(所有选项都被描述 in the documentation)。