T-SQL - 如果在游标中循环并同时插入 table 会发生什么?
T-SQL - what happens if am looping through cursor and at the same time an insert into the table happens?
考虑一下。我有一个名为 dbo.Event 的 table。
我为它声明了一个游标:
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 需要一些时间来遍历光标触发时我们在 table 中拥有的所有可用值。当光标到达 运行 但插入发生在 dbo.Event 时会发生什么。 运行 游标是否已经拾取这个新插入的值并对其进行迭代?或者在游标执行结束时新插入的值不会被游标处理?
我非常确定游标的默认选项是动态的,因此对基础数据的修改会反映在游标中。如果您想要特定的行为,请明确说明而不是依赖默认行为,例如
DECLARE A CURSOR LOCAL STATIC FAST_FORWARD
FOR...
您可以在声明后使用以下方法检查属性:
SELECT properties
FROM sys.dm_exec_cursors(@@spid);
听起来您想在游标打开时获取数据的快照,因此您应该使用静态游标。
考虑一下。我有一个名为 dbo.Event 的 table。
我为它声明了一个游标:
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 需要一些时间来遍历光标触发时我们在 table 中拥有的所有可用值。当光标到达 运行 但插入发生在 dbo.Event 时会发生什么。 运行 游标是否已经拾取这个新插入的值并对其进行迭代?或者在游标执行结束时新插入的值不会被游标处理?
我非常确定游标的默认选项是动态的,因此对基础数据的修改会反映在游标中。如果您想要特定的行为,请明确说明而不是依赖默认行为,例如
DECLARE A CURSOR LOCAL STATIC FAST_FORWARD
FOR...
您可以在声明后使用以下方法检查属性:
SELECT properties
FROM sys.dm_exec_cursors(@@spid);
听起来您想在游标打开时获取数据的快照,因此您应该使用静态游标。