Sql server Sql Server存储过程游标名称冲突
我遇到过这样一种情况:一个SQL Server存储过程调用另一个存储过程,而这两个存储过程恰好使用同名的游标。这会导致冲突,因为显然游标的可见性不限于声明它们的存储过程Sql server Sql Server存储过程游标名称冲突,sql-server,cursor,Sql Server,Cursor,我遇到过这样一种情况:一个SQL Server存储过程调用另一个存储过程,而这两个存储过程恰好使用同名的游标。这会导致冲突,因为显然游标的可见性不限于声明它们的存储过程 有没有办法使游标对声明它们的过程是私有的?显然有一个本地关键字 在需要时使用本地选项 本地 指定光标的作用域 是批本地的,已存储 过程或触发器,其中 光标已创建。光标名称为 仅在此范围内有效。这个 光标可以被本地用户引用 批处理中的游标变量,已存储 过程、触发器或存储 过程输出参数。输出 参数用于传递本地 光标返回到调用批处理,
有没有办法使游标对声明它们的过程是私有的?显然有一个本地关键字 在需要时使用本地选项 本地 指定光标的作用域 是批本地的,已存储 过程或触发器,其中 光标已创建。光标名称为 仅在此范围内有效。这个 光标可以被本地用户引用 批处理中的游标变量,已存储 过程、触发器或存储 过程输出参数。输出 参数用于传递本地 光标返回到调用批处理, 存储过程或触发器 可以将参数指定给光标 变量来引用光标 存储过程终止。这个 当 批处理、存储过程或 触发器终止,除非光标 已在输出中传回 参数如果它在一段时间内传回 输出参数,光标为 当最后一个变量 引用它是解除分配还是继续 超出范围
游标是
本地的
游标还是全局的
游标?…将它们设置为本地的
,或者只需更改其中一个游标的名称并使用它即可是的,您可以使用
将光标声明为本地除非您特别需要全局光标,否则请使用本地光标 如果游标声明不包含关键字LOCAL或GLOBAL,则SQL Server将使用其默认服务器配置。您可以使用以下查询确定默认配置:
SELECT is_local_cursor_default FROM sys.databases WHERE name = DB_NAME();
默认情况下,如果在声明游标时未填写本地/全局开关,则会将其隐式设置为本地。但是,我建议在阅读代码时,为其他人的清晰性定义本地代码 请参考以下文章注释:
如果要在同一范围内(同一存储过程)编写两个游标,只需将它们命名为不同的名称。为什么不能在任何一个SP中修改游标名称?游标是非常强大的构造,许多事情只能在SQL中使用游标来完成。是的,它们比设置操作慢,但将所有数据从数据库中拉出、处理并将其推回,这也是许多人乐于做的,以避免在光标正常工作时使用光标。默认情况下,如果在声明光标时未填写本地/全局开关,它将被隐式设置为本地。但是,我建议在阅读代码时,为其他人的清晰性定义本地代码。