gpt4 book ai didi

sql - TSQL 不会导致无限循环

转载 作者:行者123 更新时间:2023-12-01 23:51:37 28 4
gpt4 key购买 nike

请看下面的代码:

declare @crimeurn varchar(20)
DECLARE @finalresults TABLE (crime_urn varchar(20))
DECLARE @potentialresults TABLE (crime_urn varchar(20))

insert into @finalresults values ('1')

DECLARE finalresults_cursor CURSOR FOR
SELECT crime_urn FROM @finalresults
OPEN finalresults_cursor
FETCH NEXT FROM finalresults_cursor INTO @crimeurn

WHILE @@FETCH_STATUS = 0
BEGIN
print @crimeurn

INSERT INTO @finalresults
values ('2')

FETCH NEXT FROM finalresults_cursor INTO @crimeurn
END

select * from @finalresults --line 16

CLOSE finalresults_cursor
DEALLOCATE finalresults_cursor

第 16 行在 SQL Studio 管理器中显示 5137 或 12,342 行(随机变化)。我预计 TSQL 会导致无限循环,因为在游标的每次迭代中都会插入到表变量中。

为什么不会造成死循环呢?即为什么返回 5,137 或 12,342 行。

最佳答案

您正在向堆中插入。

堆是无序的。没有特别保证该行将被插入到当前行之后并在下一次提取时被拾取。

我对您的测试框架稍作修改并添加了一个 IDENTITY 列。在我的例子中,它在终止前到达了第 592,353 行。

正如您从下面的结果中看到的那样,最后一行恰好插入到文件的较早页面(从 1623 跳到 184),因此从倒数第二行开始的分配顺序扫描找不到它。

enter image description here

要重现的代码。

declare @crimeurn varchar(20)
DECLARE @finalresults TABLE (crime_urn varchar(20), ID int identity)
DECLARE @potentialresults TABLE (crime_urn varchar(20))

insert into @finalresults values ('1')

DECLARE finalresults_cursor CURSOR FOR
SELECT crime_urn FROM @finalresults
OPEN finalresults_cursor
FETCH NEXT FROM finalresults_cursor INTO @crimeurn

WHILE @@FETCH_STATUS = 0
BEGIN
print @crimeurn

INSERT INTO @finalresults
--OUTPUT INSERTED.ID
values ('2')

FETCH NEXT FROM finalresults_cursor INTO @crimeurn
END

select *, sys.fn_PhysLocFormatter(%%physloc%%) from @finalresults --line 16
ORDER BY ID

CLOSE finalresults_cursor
DEALLOCATE finalresults_cursor

关于sql - TSQL 不会导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26217386/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com