Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Sql Server存储过程游标名称冲突_Sql Server_Cursor - Fatal编程技术网

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

Sql server Sql Server存储过程游标名称冲突,sql-server,cursor,Sql Server,Cursor,我遇到过这样一种情况:一个SQL Server存储过程调用另一个存储过程,而这两个存储过程恰好使用同名的游标。这会导致冲突,因为显然游标的可见性不限于声明它们的存储过程 有没有办法使游标对声明它们的过程是私有的?显然有一个本地关键字 在需要时使用本地选项 本地 指定光标的作用域 是批本地的,已存储 过程或触发器,其中 光标已创建。光标名称为 仅在此范围内有效。这个 光标可以被本地用户引用 批处理中的游标变量,已存储 过程、触发器或存储 过程输出参数。输出 参数用于传递本地 光标返回到调用批处理,

我遇到过这样一种情况:一个SQL Server存储过程调用另一个存储过程,而这两个存储过程恰好使用同名的游标。这会导致冲突,因为显然游标的可见性不限于声明它们的存储过程


有没有办法使游标对声明它们的过程是私有的?

显然有一个本地关键字

在需要时使用本地选项

本地

指定光标的作用域 是批本地的,已存储 过程或触发器,其中 光标已创建。光标名称为 仅在此范围内有效。这个 光标可以被本地用户引用 批处理中的游标变量,已存储 过程、触发器或存储 过程输出参数。输出 参数用于传递本地 光标返回到调用批处理, 存储过程或触发器 可以将参数指定给光标 变量来引用光标 存储过程终止。这个 当 批处理、存储过程或 触发器终止,除非光标 已在输出中传回 参数如果它在一段时间内传回 输出参数,光标为 当最后一个变量 引用它是解除分配还是继续 超出范围


游标是
本地的
游标还是
全局的
游标?…将它们设置为
本地的
,或者只需更改其中一个游标的名称并使用它即可

是的,您可以使用


将光标声明为本地

除非您特别需要全局光标,否则请使用本地光标

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

SELECT is_local_cursor_default FROM sys.databases WHERE name = DB_NAME();

默认情况下,如果在声明游标时未填写本地/全局开关,则会将其隐式设置为本地。但是,我建议在阅读代码时,为其他人的清晰性定义本地代码

请参考以下文章注释:


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

为什么不能在任何一个SP中修改游标名称?游标是非常强大的构造,许多事情只能在SQL中使用游标来完成。是的,它们比设置操作慢,但将所有数据从数据库中拉出、处理并将其推回,这也是许多人乐于做的,以避免在光标正常工作时使用光标。默认情况下,如果在声明光标时未填写本地/全局开关,它将被隐式设置为本地。但是,我建议在阅读代码时,为其他人的清晰性定义本地代码。