Sql Server存储过程游标名称冲突

时间:2010-08-19 18:07:33

标签: sql-server cursor

我有一种情况,一个SQL Server存储过程正在调用另一个,并且两者都碰巧使用具有相同名称的游标。这引起了冲突,因为游标显然没有可见性限制在声明它们的存储过程中。

有没有办法让游标专用于声明它们的程序?

6 个答案:

答案 0 :(得分:7)

declaring the cursor时使用LOCAL选项。

  

本地

     

指定游标的范围   是批处理的本地存储   程序,或触发器   光标已创建。光标名称是   仅在此范围内有效。该   游标可以由本地引用   批处理中的游标变量,存储   程序,触发器或存储的   过程OUTPUT参数。输出   参数用于传递本地   光标回到调用批处理,   存储过程或触发器   可以将参数分配给游标   变量引用后的光标   存储过程终止。该   当光标被隐式释放时   批处理,存储过程或   触发器终止,除非光标   在OUTPUT中传回   参数。如果它被传回来了   OUTPUT参数,光标是   在最后一个变量时取消分配   引用它是取消分配或去   超出范围。

答案 1 :(得分:4)

答案 2 :(得分:3)

是的,您可以使用

将游标范围限制为存储过程

DECLARE CURSOR LOCAL

答案 3 :(得分:2)

游标是local游标还是global游标?...让它们local或只更改其中一个游标的名称并完成它

答案 4 :(得分:0)

除非您明确需要全局游标,否则请使用本地游标。

如果您的游标声明不包含关键字LOCAL或GLOBAL,则SQL Server将使用其默认服务器配置。您可以使用以下查询确定默认配置:

Array
(
    [0] => Array
        (
            [ts] => 1451602800
            [time] => 2015-12-31T23:00:00+0000
            [offset] => -18000
            [isdst] => 
            [abbr] => EST
        )

    [1] => Array
        (
            [ts] => 1457852400
            [time] => 2016-03-13T07:00:00+0000
            [offset] => -14400
            [isdst] => 1
            [abbr] => EDT
        )

    [2] => Array
        (
            [ts] => 1478412000
            [time] => 2016-11-06T06:00:00+0000
            [offset] => -18000
            [isdst] => 
            [abbr] => EST
        )

)

答案 5 :(得分:0)

默认情况下,如果在声明游标时没有填写LOCAL / GLOBAL开关,它将被隐式设置为LOCAL。但我建议在阅读代码时为其他人定义LOCAL。

请参阅以下文章说明:

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql

如果要在同一范围内编写两个游标(相同的存储过程),只需将它们命名为不同的名称。