3

我注意到在编写插入表变量的 sproc 值时,其顺序与插入顺序不同。有没有办法在不添加另一列进行排序的情况下禁用这种自动排序?想到的想法是正在创建的自动索引或一些排序规则设置......有什么想法吗?

访问http://sqlfiddle.com/#!3/e1c06/13看看我的意思

declare @tmpTbl table (name varchar(100))
insert into @tmpTbl
select 'mark'
union
select 'frank'
union
select 'sharon'
union
select 'jason'

select * from @tmpTbl
4

2 回答 2

5

简短的回答是(可能)“因为存储引擎将您的行存储在无序堆中,当您不指定 ORDER BY 时,这会影响行的输出方式。”

根据 SQL 规范,除非您在 SELECT 查询中提供 ORDER BY,否则排序顺序是undefined 。这就是它在每个 SQL 数据库中的方式,无论是 MySql、Oracle 还是 SQL Server。如果数据以您期望的顺序从表中出来,那是巧合,或者很可能是优化器如何生成查询的副作用,或者存储引擎如何选择物理存储行(可能是在这种情况下的根本原因)。

如果您以所需的排序顺序向表中添加聚集索引,则多次(但并非总是)该表将按照您期望的顺序出现。 永远不要依赖这种行为。

于 2013-01-23T15:51:45.213 回答
3

如果您希望它们按插入顺序排序,则在表中添加一个自动递增字段,然后您可以在选择数据时将其包含在 ORDER BY 中。

否则 SQL Server 将不会以特定顺序返回您的数据 - 它现在可能似乎正在“排序”返回它,但将来可能不是这种情况。

顺便说一句 - 联合查询本身实际上返回的结果排序不同于它们在您的语句中出现的顺序。这可能是使用 UNION 与 UNION ALL 的结果,因为 union 是不同的,它可能意味着某种类型。所以,你得到的结果实际上是插入顺序。

于 2013-01-23T15:56:33.220 回答