T-Sql算法问题

时间:2010-10-07 10:07:09

标签: sql tsql

我有一个T-Sql语句如下;

Insert into Table1
Select * From Table2

我想知道运行顺序。 insert是否在启动之前等待select语句完成,或者启动asap select语句开始返回值并期望select语句中的新记录继续。

这是一个普通的存储过程,没有使用任何事务。

2 个答案:

答案 0 :(得分:3)

你所拥有的只是一个单一的声明。它只会在开始插入时将表2中存在的记录插入表2中。否则,ACID的属性将不适用,并且您将遇到隔离问题(如果sp同时运行两次)和持久性。 SQL Server将通过锁定来强制执行此操作。

答案 1 :(得分:2)

回应@ CodeByMoonlight的回答,并在那里解决您的评论:物理注意事项(包括锁定的细节)始终从属于由指定的逻辑指令。查询。

在处理INSERT ... SELECT语句时,逻辑上说执行SELECT以生成结果集,然后此结果集的行为{{1} }编辑。在这种情况下,源表和目标表是同一个表是无关紧要的。我非常确定指定INSERTNOLOCK在任何情况下都只适用于TABLOCK,如果这是您定位它们的位置。

考虑这个陈述的另一个例子,如果你以“命令式”的方式阅读它,那是没有意义的:

SELECT

使用命令式而非基于集合的理解,此语句可能看起来好像会导致UPDATE SomeTable SET Column1 = Column2, Column2 = Column1 Column1对所有行具有相同的值。但它没有 - 它实际上交换 Column2Column1中的值。只有了解查询的逻辑指令才能确定实际发生的事情才能看到。