从表变量中选择的数据与插入的顺序不同?

时间:2012-06-11 16:26:34

标签: sql sql-server

我有一个数据类型为Varchar(MAX)的表变量。

我首先插入值'header',然后基于内连接,我接下来将'Details'插入到同一个表变量中。最后,我正在插入“预告片”。

我得到的输出是顺序:'header',然后'trailer',最后是'details'。

我所需的输出顺序如下:

Header 
Detail
Trailer

但是我收到了这个订单:

Header
Trailer
Detail

注意:我无法在选择中使用asc / desc。我按照我需要的顺序插入。

2 个答案:

答案 0 :(得分:6)

如果您不在外部查询中包含ORDER BY,请不要期望SQL Server读懂您的想法。无法保证SQL Server将按插入顺序返回数据。您应该在名为[rank]的表变量中添加一列。当您插入标题时,插入1,对于详细信息行,插入2,然后插入预告片3.现在,您可以在查询结尾添加ORDER BY [rank];,获得可预测的结果,并且每个人都很满意。< / p>

答案 1 :(得分:2)

SQL数据库实际上并不了解您放入内容的顺序,或以给定顺序存储数据。您可能希望表中的第二列具有要使用的值,以便保留所需的任何顺序。

想想就像将一些东西交给你的朋友一样 - 她以后会为你准备好所有这些东西,但她会在同一时间把它存放到某个地方。当你不打算为其他东西腾出空间时,她可能会移动它,或者可能按照你给她的顺序将它移回去,但是你并没有告诉她要保持顺序,所以她没有。

数据库需要能够在后台移动东西,所以它们的构建方式本质上不知道任何顺序 - 当你将它提供给数据库时你需要知道顺序,以便你可以把它放到以你想要的顺序回来。 order子句允许SQL对数据强加一个顺序,但它不记得或者有一个单独的数据。