SQL Server服务器函数中的错误Order by子句

时间:2015-12-30 04:05:22

标签: sql sql-server

我有连接到其他表的SQL服务器查询功能,我有一些错误

  

ORDER BY子句在视图,内联函数中派生无效   表,子查询和公用表表达式,除非TOP,OFFSET   或者也指定了FOR XML。

    CREATE FUNCTION [dbo].[GetMutationUnGrouped]     
    (   
        -- Add the parameters for the function here
        @startDate Date, 
        @endDate Date,
        @PlaceId nvarchar(128)



    )
    RETURNS TABLE 
    AS
    RETURN (
        SELECT mut.*,inv.Barcode, itm.ItemName,plc.PlaceName,loc.ItemLocationName,sub.ItemSubLocationName,inv.BuyDate,inv.Cost,typ.TypeName

        FROM ItemInventoryMutation mut 
        JOIN ItemInventory inv ON mut.ItemInventoryId = inv.Id
        JOIN Items itm ON inv.itemId = itm.Id
        JOIN ItemTypes typ ON itm.ItemTypesId = typ.Id
        JOIN ItemSubLocations sub ON mut.ItemSublocationId = sub.Id
        JOIN ItemLocations loc ON sub.ItemLocationsId = loc.Id
        JOIN Place plc ON loc.PlaceId = plc.Id


        WHERE (inv.BuyDate >= @startDate AND inv.BuyDate <= @endDate) AND  (inv.itemId IS NOT NULL AND inv.IsDelete = 0) AND loc.PlaceId = @PlaceId
        ORDER BY mut.Id ASC, mut.MutationDate DESC

    )

导致错误的原因是什么?谢谢

1 个答案:

答案 0 :(得分:1)

嗯,这正是错误消息所说的内容 - 除非指定ORDER BY,否则不能在返回表定义中使用TOP

我猜你不想在这种情况下指定TOP并希望返回所有记录。在这种情况下,您应该从[dbo].[GetMutationUnGrouped]函数返回未订购的记录,并在使用该函数时对它们进行排序。

您可以在MSDN找到更多信息:

  

ORDER BY子句在视图,内联函数中派生无效   表和子查询,除非是TOP或OFFSET和FETCH   条款也被指定。在这些对象中使​​用ORDER BY时   该子句仅用于确定TOP返回的行   子句或OFFSET和FETCH子句。 ORDER BY子句没有   保证在查询这些结构时的有序结果,除非   ORDER BY也在查询本身中指定。

因此,如果您想从您的函数中获取有序记录,那将无法工作 - 即使您在函数中指定了TOP,也必须再次订购记录。