SQL表返回函数中的SQL ORDER BY

时间:2019-03-11 10:20:43

标签: sql sql-server

所以我有一个简单的函数试图从数据库中获取两个字段。我正在尝试将order by用于结果,但是我不能在return子句中使用ORDER BY。 它告诉我

  

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

是否可以在RETURN语句中使用ORDER BY?我想避免在执行函数时使用order。

CREATE FUNCTION goalsGames1 () RETURNS TABLE
AS RETURN(
    SELECT MAX(goals_scored) goals,
           no_games
    FROM Player
    GROUP BY no_games
    ORDER BY no_games DESC )

4 个答案:

答案 0 :(得分:2)

跳过此错误的一种技巧是使用top,如错误消息中所述:

CREATE FUNCTION goalsGames1 () RETURNS TABLE
AS RETURN(
    SELECT Top 100 Percent MAX(goals_scored) goals,
           no_games
    FROM Player
    GROUP BY no_games
    ORDER BY no_games DESC )

答案 1 :(得分:2)

  

我希望在执行函数时避免使用order。

如果您正在使用该函数并希望结果按特定顺序排列,则需要使用ORDER BY

这在documentation中有明确说明:

  

执行SELECT查询时,ORDER子句不保证有序结果,除非查询中也指定了ORDER BY。

答案 2 :(得分:1)

在选择函数时使用order by而不是在创建时使用

因此请在select * from goalsGames1 order by col

中使用

您的错误告诉您排序依据无效的地方

答案 3 :(得分:1)

您不能通过函数内部进行排序,其想法是对函数返回的结果集进行排序。

select * 
from   dbo.goalsGames1() 
order by no_games

即使您要在函数内部按顺序进行排序,也不能保证在返回结果集时将保留该顺序。正在执行的查询(select * from functionname)必须负责设置顺序,而不是功能或视图。

接收行的人是唯一可以对行进行排序的人,因此,在这种情况下,select * from goalsGames1()是接收器,此查询必须对结果进行排序。