2010-04-15 138 views
3

我有简单的SSIS包,其中我将数据从平面文件导入SQL Server表(SQL Server 005)。文件包含70k行,表没有主键。导入是成功的,但是当我打开SQL Server表时,行的顺序与文件的顺序不同。仔细观察后,我发现表中的数据按第一列默认排序。为什么发生这种情况?以及我如何避免默认排序? 谢谢。默认情况下,SQL Server表排序

+0

首先:为什么表没有主键? *如果它没有PK,那不是桌子!*。此外:SQL Server表是** NOT **排序 - 但显示该数据的UI(SQL Server Mgmt Studio或其他)将不得不以某种方式对其进行排序。 – 2010-04-15 05:33:59

+0

一张表不_需要主键或者任何索引或唯一约束。规范化的表格需要一个主键,是的,设计没有一个是非常愚蠢的,但这绝不是必需的。否则SQL会在'create table'语句中强制它。 – paxdiablo 2010-04-15 05:42:03

回答

11

除非在SQL查询中指定order by,否则不能依赖排序。 SQL是一个与集合一起工作的关系代数。那些集合是无序的。数据库表没有内在的顺序。

很可能是由于从表格中检索数据的方式而使集合被排序。这可以基于主键,插入顺序,聚簇键,基于查询的执行计划的表面上的随机顺序或者表中的实际数据或甚至月相。

底线,如果您想要特定订单,请使用order by。如果您不想要特定的订单,则DBMS可以自由地按任意订单交付您的行,包括基于第一列的订单。

如果您确实希望它们根据导入文件中的位置进行排序,则应该向表中添加另一列以根据该文件在该文件中的位置存储日益增加的数字。然后使用该列使用order by。但是,这是一个非常随意的排序顺序,通常选择对数据更有意义的交易(交易ID,日期/时间,客户编号或您拥有的任何其他资源)会更好。

如果您想避免默认排序(不过可能是变量),请使用特定排序。

+0

谢谢pax!按照文件中的数据进行排序是有意义的,我会看到如何实现这一点。无论如何,如果这是不可能的,我可以使用你的第一个建议来使用自动增量列?当我按这个列排序时,它会给我和文件一样的顺序吗? – pramodtech 2010-04-15 05:50:14

+0

是的,如果你可以正确地分配数字。但是你需要注意多个不同文件的导入,他们需要获得不断增加的数字。在决定使用自动增量列之前,应检查导入使用的插入顺序是否为文件的插入顺序。但是,我仍然怀疑这个命令的用处。为什么数据按文件中的位置排序很重要? – paxdiablo 2010-04-15 05:55:03

+0

我想我可以将列指定为Identity(1,1),并且数字将按照顺序排列,因此我不必担心正确分配数字。我会试试这个。订单对于客户来说很重要,我不知道这是他们的需求。 – pramodtech 2010-04-15 06:10:47

7

如果在选择查询中没有排序,则通常没有订单是应用

我注意到,表结果可能返回的主键的顺序,但这也不是保证。

因此,总而言之,如果您不指定排序,则不能假定排序。

+1

那么说...... – 2010-04-15 05:32:55

+0

文件没有唯一的字段,我想要命令与文件中的相同。我怎样才能做到这一点? – pramodtech 2010-04-15 05:44:28