嗨,我有这段代码,
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生成的顺序相同? 或者两个结果集输出是否相同?
答案 0 :(得分:2)
没有什么可以保证它,所以安全和正确的答案是"不,这不能得到保证"。
practice 中会发生的事情是,如果插入是作为非并行语句执行的,那么行的物理顺序很可能与存储过程的排序顺序相匹配。但更有趣的是,当然,没有办法告诉使用任何SELECT
的情况 - 因为任何没有SELECT
的{{1}}都不能保证订单本身以及任何具有ORDER BY
的{{1}}都会对结果进行排序(无论是否知道,并且不会假设行已按所需顺序排列)。如果涉及并行性并且您没有SELECT
,则结果可以重新排列,即使它们恰好位于"正确"在表中订购。
因此,我会回到我们开始的地方并说“不”,这不能保证"。只要您想要特定订单的结果,请在检索上使用ORDER BY
。担心插入上的订单通常仅在您进行批量插入操作时才有意义,即便如此,它只对性能有关,而不是对结果的正确性有影响。如果您发现自己编写的任何查询未能使用ORDER BY
完全强制执行结果的顺序,并且您仍然依赖于此,那么您做错了。