2015-07-18 78 views
1

我已经在几个不同的网站上了解这个问题,但我仍然不明白解决方案。 据我所知,SQL将优化函数中的查询,有时Order By子句将被忽略。你如何分类结果?排序依据SQL表值函数

我怎样才能在这样一个简单的表值函数中排序结果?

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 

UPDATE

我发现插入一个主键标识字段似乎帮助(如在答复中提到张贴马丁·史密斯)。这是一个好的解决方案吗?

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

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

如果添加标识字段是一个安全的解决方案,我很乐意去解决这个问题。这很简单,容易。

+0

关于你的编辑不是一个好的解决方案。唯一有保证的解决方案是在外部'select'中使用'order by'。例如,表变量(具有隐式'nolock'提示)完全可以获得分配有序扫描并返回行中的关键顺序。添加一个ID列的目的是获得一些可以被外部'order by'引用的东西而不是替代它。你应该问另一个关于如何让你的Linq查询添加所需的'order by'而不是忽略它的问题,并希望TVF在没有它的情况下保持一定的顺序。 –

+0

谢谢,我将不得不提出关于linq排序的另一个问题。 – madvora

回答

3

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

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

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

+0

谢谢你的回应。请参阅我更新的帖子。我想听听你的意见。 – madvora