SQL';订购人';子句似乎有效,但返回未排序的数据

SQL';订购人';子句似乎有效,但返回未排序的数据,sql,sql-server,sql-order-by,Sql,Sql Server,Sql Order By,我在SQL Server 2014中有这个表值函数。最重要的部分是结尾的“orderby”,它似乎什么都没做。如果我将其取出或删除描述,最终结果是相同的。为什么会这样?我通常希望它以最新->最不新的方式使用 BEGIN INSERT INTO @result (Id, Name, Description, TypeID, Date) select b.ID, b.Name, b.Description, b.TypeID, max(Date) from BTable b

我在SQL Server 2014中有这个表值函数。最重要的部分是结尾的“orderby”,它似乎什么都没做。如果我将其取出或删除描述,最终结果是相同的。为什么会这样?我通常希望它以最新->最不新的方式使用

BEGIN
    INSERT INTO @result (Id, Name, Description, TypeID, Date)
        select b.ID, b.Name, b.Description, b.TypeID, max(Date) from BTable b
        inner join ATTable at on b.atID = at.ID
        inner join STATTable stat on at.ID= stat.atID
        inner join CCTable cc on stat.stID= cc.stID
        inner join STTAble st on cc.stID= st.ID
        inner join TSTable ts on ts.cID = @cID and ts.bID = b.ID
            where b.Active = 1 and at.Active = 1 and stat.Active = 1 and cc.Active = 1 and st.Type = 1 AND 
                cc.cID = @cId and (b.cID IS NULL OR b.cID = @cId) and b.aID = (Select c.aID from CTable c where c.ID = @cId)
        GROUP BY b.ID, b.Name, b.Description, b.atID
        ORDER BY Max(Date) DESC
RETURN
当使用此函数时,我得到如下结果:

Id      |Name                  | Date
----------------------------------------------------------------------------
32      |Mary       | NULL | 1 |    2015-06-04 00:00:00.000
68      |Joyce      | NULL | 1 |    2015-02-25 00:00:00.000
1069    |James      | NULL | 1 |    2014-03-31 00:00:00.000
1079    |Nwabudike  | NULL | 1 |    2015-06-04 00:00:00.000
1143    |Hala       | NULL | 1 |    2015-03-17 00:00:00.000
这显然不是按日期排序的。 为什么会这样?我如何才能正确订购?

你不能

结果集的顺序仅由最外层查询中的
orderby
确定

因此,忘记函数中的order by。然后将函数调用为:

select t.*
from dbo.tblfunc() t
order by t.date_received desc;
编辑:


老实说,如果
@result
是一个具有聚集、标识和主键的“真实”表,并且您使用
按顺序插入了行,那么您很有可能将它们按顺序恢复。对于较小的表来说也是如此(因为该表是由聚集索引扫描的)。我不确定它在并行环境中是否总是正确的。

此外,您可以将函数转换为内联tvf以提高性能。有趣。如果我将
select
更改为
select top X
,返回的表是否保证只包含
X
最近的条目?@Knells。是的,但不一定按顺序。