我有一种情况,一个SQL Server存储过程正在调用另一个,并且两者都碰巧使用具有相同名称的游标。这引起了冲突,因为游标显然没有可见性限制在声明它们的存储过程中。
有没有办法让游标专用于声明它们的程序?
答案 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
如果要在同一范围内编写两个游标(相同的存储过程),只需将它们命名为不同的名称。