插入#result exec(@sql)这是否保证了结果集插入#result的顺序?

时间:2015-03-04 18:18:04

标签: sql dynamic-sql temp-tables

嗨,我有这段代码,

ALTER PROCEDURE [dbo].[Proc0] AS BEGIN
CREATE TABLE #result (id int identity(1,1), data varchar(max))

--result sorted by data
exec proc1 --let say proc1 sort data on output 

DECLARE @sql varchar(max)
SELECT @sql = 'exec proc1 ' --returns only 1 column
SELECT @sql='INSERT INTO #result ' +@sql
EXEC(@sql)

SELECT * FROM #result order by id
END

插入#result的结果集是否与proc1生成的顺序相同? 或者两个结果集输出是否相同?

1 个答案:

答案 0 :(得分:2)

没有什么可以保证它,所以安全和正确的答案是"不,这不能得到保证"。

practice 中会发生的事情是,如果插入是作为非并行语句执行的,那么行的物理顺序很可能与存储过程的排序顺序相匹配。但更有趣的是,当然,没有办法告诉使用任何SELECT的情况 - 因为任何没有SELECT的{​​{1}}都不能保证订单本身以及任何具有ORDER BY的{​​{1}}都会对结果进行排序(无论是否知道,并且不会假设行已按所需顺序排列)。如果涉及并行性并且您没有SELECT,则结果可以重新排列,即使它们恰好位于"正确"在表中订购。

因此,我会回到我们开始的地方并说“不”,这不能保证"。只要您想要特定订单的结果,请在检索上使用ORDER BY。担心插入上的订单通常仅在您进行批量插入操作时才有意义,即便如此,它只对性能有关,而不是对结果的正确性有影响。如果您发现自己编写的任何查询未能使用ORDER BY完全强制执行结果的顺序,并且您仍然依赖于此,那么您做错了。

相关问题