我有一个T-Sql语句如下;
Insert into Table1
Select * From Table2
我想知道运行顺序。 insert是否在启动之前等待select语句完成,或者启动asap select语句开始返回值并期望select语句中的新记录继续。
这是一个普通的存储过程,没有使用任何事务。
答案 0 :(得分:3)
你所拥有的只是一个单一的声明。它只会在开始插入时将表2中存在的记录插入表2中。否则,ACID的属性将不适用,并且您将遇到隔离问题(如果sp同时运行两次)和持久性。 SQL Server将通过锁定来强制执行此操作。
答案 1 :(得分:2)
回应@ CodeByMoonlight的回答,并在那里解决您的评论:物理注意事项(包括锁定的细节)始终从属于由指定的逻辑指令。查询。
在处理INSERT ... SELECT
语句时,逻辑上说执行SELECT
以生成结果集,然后此结果集的行为{{1} }编辑。在这种情况下,源表和目标表是同一个表是无关紧要的。我非常确定指定INSERT
或NOLOCK
在任何情况下都只适用于TABLOCK
,如果这是您定位它们的位置。
考虑这个陈述的另一个例子,如果你以“命令式”的方式阅读它,那是没有意义的:
SELECT
使用命令式而非基于集合的理解,此语句可能看起来好像会导致UPDATE SomeTable
SET Column1 = Column2, Column2 = Column1
和Column1
对所有行具有相同的值。但它没有 - 它实际上交换 Column2
和Column1
中的值。只有了解查询的逻辑指令才能确定实际发生的事情才能看到。