【问题标题】:T-SQL - what happens if am looping through cursor and at the same time an insert into the table happens?T-SQL - 如果循环游标并同时插入到表中会发生什么?
【发布时间】:2015-04-19 20:20:00
【问题描述】:

考虑一下。我有一个名为 dbo.Event 的表。

我为它声明了一个游标:

declare myCur cursor for 
    select a from dbo.event

然后我:

open myCur
fetch next from myCur into @temp
while @@fetschstatus = 0
    ...
    do the job using fetched value
    ...
fetch next from myCur into @temp
end

问题是 - myCur 需要一些时间来遍历我们在光标触发时表中的所有可用值。当光标一直运行但插入发生在 dbo.Event 中时会发生什么。已经运行的游标会拾取这个新插入的值并对其进行迭代吗?还是游标执行结束时新插入的值不会被游标处理?

【问题讨论】:

  • 关于游标的规则 #1:尽可能避免使用
  • @marc_s 我知道 :) 问题是我有一个遗留代码,我需要弄清楚为什么它没有工作(如果问题出在代码本身或其他方面)。所以不幸的是,我需要澄清这一点。
  • 如果您有遗留代码需要仔细分析,这似乎是摆脱遗留代码中光标的绝佳机会。
  • 是的。仅当您是有权更改客户平台上的代码的开发人员,而不是需要找到问题的根本原因并将其报告给开发团队的实施工程师时。现在我什至不确定我的问题是由游标引起的 - 对原始问题的回答会澄清它。
  • 我很确定游标的默认选项是DYNAMIC,因此对基本数据的修改会反映在游标中。如果您想要特定的行为,请明确说明,例如DECLARE A CURSOR LOCAL STATIC FAST_FORWARD FOR... 不要依赖默认值。您可以使用SELECT properties FROM sys.dm_exec_cursors(@@spid); 声明后检查属性,听起来您想要在游标打开时获取数据的快照,因此您应该使用静态游标。

标签: sql sql-server tsql cursor


【解决方案1】:

我很确定游标的默认选项是动态的,因此对基础数据的修改会反映在游标中。如果您想要特定的行为,请明确声明它而不是依赖默认行为,例如

DECLARE A CURSOR LOCAL STATIC FAST_FORWARD 
FOR... 

您可以在声明后检查属性:

SELECT properties 
FROM sys.dm_exec_cursors(@@spid);

听起来您想要在光标打开时获取数据的快照,因此您应该使用静态光标。

【讨论】:

  • 查看文档,“如果同时指定了 FAST_FORWARD 或 STATIC,则无法指定 SCROLL_LOCKS。”
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2016-05-25
  • 2017-06-21
相关资源
最近更新 更多