我在几个不同的网站上看过这个问题,但我仍然不明白这个解决方案。 据我所知,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查询中。那时我的能力超出了我的能力。
如果添加身份字段是一个安全的解决方案,我很高兴能够这样做。这很简单。
答案 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查询进行排序