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

Sql 从表变量中选择的数据与插入的顺序不同?,sql,sql-server,Sql,Sql Server,我有一个数据类型为VarcharMAX的表变量 首先插入值'header',然后基于内部联接,接下来将'Details'插入到同一个表变量中。最后,我插入“拖车” 我得到的输出顺序是:“header”,然后是“trailer”,最后是“details” 我所需的输出顺序如下: Header Detail Trailer Header Trailer Detail 但我得到的订单是: Header Detail Trailer Header Trailer Detail 注意:我无法在

我有一个数据类型为VarcharMAX的表变量

首先插入值'header',然后基于内部联接,接下来将'Details'插入到同一个表变量中。最后,我插入“拖车”

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

我所需的输出顺序如下:

Header 
Detail
Trailer
Header
Trailer
Detail
但我得到的订单是:

Header 
Detail
Trailer
Header
Trailer
Detail

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

如果在外部查询中没有包含ORDER BY,请不要指望SQL Server能够读懂您的心思。不能保证SQL Server将按插入顺序返回数据。您应该在表变量中添加一个名为[rank]或其他的列。插入标题时,请插入1,对于详细信息行,请插入2,然后对于尾部插入3。现在您可以通过[rank]添加订单;在查询结束时,得到可预测的结果,每个人都会感到高兴。

SQL数据库实际上不了解您将数据放入的顺序,也不了解您将数据按给定顺序存储。您可能希望表中的第二列包含要使用的值,以便保留所需的任何顺序

想象一下,就像把一些东西交给你的朋友拿着一样——她稍后会把所有的东西都给你,但同时她会把它们存放在某个地方。她可能会在你不想为其他东西腾出空间的时候移动它,或者可能会按照你给她的顺序把它还给你,但是你没有告诉她要把它整理好,所以她没有


数据库需要能够在后台移动对象,因此它们的构建方式本质上不知道任何顺序——当您将其交给数据库时,您需要知道顺序,以便以后可以按您想要的顺序将其放回。order子句允许SQL对数据施加顺序,但它自己不记得或没有顺序

不,您认为插入表格就像插入平面文件;不是。如果不提供ORDERBY,SQL Server将以其认为最有效的顺序返回行。有时,这会与insert的顺序相匹配,但并不总是如此。@jesvin-只有在语句中添加order BY子句时,如果不添加一列来存储它,就没有insert顺序,只是为了清楚起见,即使您确实插入了。。。ORDER BY它并不意味着在您选择时将遵守相同的ORDER BY。换句话说,@Lamak的意思是在SELECT语句中添加ORDER BY,而不是INSERT。您可以尝试在表变量中添加ID列,然后优化器可能会以ID顺序返回记录:ID INT IDENTITY1,1 not NULL。@RussellFox不保证。正如一个反例,将主键放在另一列上。除非该列上的字母顺序或数字顺序恰好与插入顺序匹配,否则最有可能但仍然无法保证的结果将是boom。您还可以将这些不同的内容标题、尾部、详细信息放在单独的列中,这可能更有意义。似乎存储在标题、细节等中的数据不一定是相同的——所以为什么不以一种更有意义的方式保留它呢。当然,这取决于一大堆我们不知道的事情。思考你的类比的另一种方式是:递给你的朋友一堆1美元的钞票,然后她会把这些钞票掉在地板上。现在让她把它们捡起来,按照你给她的顺序还给你。如果你最初的订单是通过序列号,她也许能做到,而且她有时间消磨时间。。。