使用@或不使用@声明游标之类的变量的区别
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)。
我遇到了一个找不到答案的问题:
在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)。