SQL Server游标进程是按顺序或随机从临时表中进行的?

时间:2016-10-31 19:41:35

标签: sql-server sql-server-2008-r2

#tempTable是

  • 在存储过程(dbo.deleteStuff
  • 中创建和使用
  • 填充了要由同一存储过程中的游标处理的行

游标是否按照这些行加载到临时表的顺序处理临时表的行,还是随机/非确定地处理? BOL没有具体回答这个问题(我最接近的是KEYSET),我没有看到直接回答或暗示引擎如何解析这个特定场景的博客文章/等。

正在加载和处理临时表的列只有三列:

  • 一个人类可读的摘要,说明为什么要删除某些内容 (有效记录到dbo.tblWhatGotDeleted)。
  • 要删除的行的唯一标识符(相同)。
  • 已动态生成并存储在此临时文件中的SQL table,这段代码最终由游标执行。

其他事实:

  • 通过比较源动态生成删除语句 查看目标表(例如,比较tblFoo EXCEPT vwFoo。)如果行没有 在目标表中的源视图中存在的时间更长 目标表中的行将被删除并写入 临时表。这个过程重复了大约二十几个表格。
  • proc按照为其写入行的顺序生成这些语句 首先是外键表,然后写相关的主键行 要删除的表。这个过程已经有一段时间了, 然后,删除所有外键控行的行 删除主键的行,因此理论上不会强制执行约束或 绊倒了。
  • 临时表上没有INT /标识/主键/索引
  • 尽管存储在temp中的唯一标识符/值 表,由于光标(我知道)没有强制执行任何顺序 临时表持有许多很多表的删除语句,而不是 只有一个(见下文)
  • 加载临时表的所有处理都在一个批处理中完成。在 在加载结束时,调用游标并执行SQL以启动 剔除表格中的行。
  • 是的,很难看。 :)

临时表加载顺序,由动态SQL驱动:

DELETE from tblFoo where thisidentifer = '1';
DELETE from tblFoo where thisidentifier = '5';
DELETE from tblFoo where thisidentifier = '7';
DELETE from tblBar where thatidentifier = 'Apple';
DELETE from tblBar where thatidentifier = 'Orange';
DELETE from tblBar where thatIdentifier = 'Pear';
DELETE from tblBlargh where otheridentifier = 'Alpha';
DELETE from tblBlargh where otheridentifier = 'Beta';
DELETE from tblBlargh where otheridentifier = 'Gamma';

我可以指望光标以相同的顺序处理这些语句吗?

 DELETE from tblFoo where thisidentifer = '1';
 DELETE from tblFoo where thisidentifier = '5';
 DELETE from tblFoo where thisidentifier = '7';
 DELETE from tblBar where thatidentifier = 'Apple';
 DELETE from tblBar where thatidentifier = 'Orange';
 DELETE from tblBar where thatIdentifier = 'Pear';
 DELETE from tblBlargh where otheridentifier = 'Alpha';
 DELETE from tblBlargh where otheridentifier = 'Beta';
 DELETE from tblBlargh where otheridentifier = 'Gamma';

此proc的过去行为暗示行按INSERT的顺序处理,但我可能还没有被引擎烧毁。

这是光标代码:

    DECLARE deleteRows CURSOR FOR
select deleteList.* from #stuffToDelete as deleteList

OPEN deleteRows

    FETCH next FROM deleteRows INTO @summaryOfWhatsGettingNuked, @theIdentifierForWhatsGettingNuked, @theSqlThatDoesTheNuking

WHILE (@@Fetch_Status = 0)
 BEGIN

    EXEC (@theSqlThatDoesTheNuking)

    FETCH next FROM deleteRows INTO @summaryOfWhatsGettingNuked, @theIdentifierForWhatsGettingNuked, @theSqlThatDoesTheNuking

 END

CLOSE deleteRows
DEALLOCATE deleteRows

0 个答案:

没有答案