在SQL表值函数中排序

时间:2015-07-18 22:49:16

标签: sql sql-server

我在几个不同的网站上看过这个问题,但我仍然不明白这个解决方案。 据我所知,SQL将优化函数中的查询,有时会忽略Order By子句。你怎么能对结果进行排序?

如何在一个像这样的简单表值函数中对结果进行排序?

Create function [dbo].fTest

--Input Parameters
(@competitionID int)

--Returns a table
RETURNS @table TABLE (CompetitionID int )

as

BEGIN
    Insert Into @table (CompetitionID)
    select CompetitionID from Competition order by CompetitionID desc
    RETURN
END

更新

我发现插入主键身份字段似乎有所帮助(如答案中提到的马丁史密斯)。这是一个很好的解决方案吗?

--Returns a table
RETURNS @table TABLE
(
    SortID int IDENTITY(1,1) PRIMARY KEY,
    CompetitionID int 
)

参考下面Martin的答案,在我的情况下,在select语句之外进行排序并不容易。我发布的示例是一个精简版本,但我的现实生活中的问题涉及一个更复杂的自定义排序的case by子句。除此之外,我在一个带有LINQ查询的MVC控制器中调用此函数,这意味着必须将自定义排序添加到LINQ查询中。那时我的能力超出了我的能力。

如果添加身份字段是一个安全的解决方案,我很高兴能够这样做。这很简单。

3 个答案:

答案 0 :(得分:5)

order by需要位于从函数中选择的语句中。

SELECT CompetitionId
FROM [dbo].fTest()
ORDER BY CompetitionId

这是获得not suddenly break in the future确保可靠结果的唯一方法。

答案 1 :(得分:0)

您可以复制结果表(声明表var @X@ret_X)。

然后在@X表上执行操作,并将以下语句作为函数中的最后一个语句。

 insert into @ret_X 
 select top 10000 * from @X
 order by (column_of_choise) desc

这给了我想要的分类。

答案 2 :(得分:-1)

最好的方法是从后端返回数据并使用c清晰代码中的linq查询进行排序