[英]Ordering results returned from table valued function
我有一个用户定义的 function 返回一个表。 问题是这个表需要根据复杂的标准进行排序,因此它不应该由 function 调用者排序,而是需要在 function 本身中排序。
简化示例
select *
from custom_function('param1', 'param2' ...)
order by
complex criteria 1,
complex criteria 2....
是否可以将订单移动到 function 并从 select 获得有序结果?
您不能直接对表进行排序,但是可以添加一列以指定顺序。 因此,将函数定义为:
select . . .,
row_number() over (order by <complex ordering criteria>) ord
. . .
然后,您可以将其称为:
select f.*
from dbo.func(. . .) f
order by ord;
您可以如下所示使用order by。 让表值函数为:
CREATE FUNCTION ReturnTableTOrder()
RETURNS @returnList TABLE (Col1 char(1), Col2 int)
AS
BEGIN
INSERT INTO @returnList
SELECT 'A',5 Union All
SELECT 'D',2 Union All
SELECT 'B',4 Union All
SELECT 'E',1 Union All
SELECT 'C',3
RETURN
END
您可以按列序号进行订购
Select * from ReturnTableTOrder()
Order by 1
o / p
Col1 Col2
A 5
B 4
C 3
D 2
E 1
对于以下查询,
Select * from ReturnTableTOrder()
Order by 2
输出是
Col1 Col2
E 1
D 2
C 3
B 4
A 5
如果您准备接受唯一的排序结果,那么执行此操作的一种方法是将 PK 添加到返回表中。
CREATE OR ALTER FUNCTION MyFunc ()
RETURNS @tblArray TABLE (Element VARCHAR(900) PRIMARY KEY WITH (IGNORE_DUP_KEY = ON))
AS BEGIN
INSERT INTO @tblArray VALUES ('c'),('b'),('a')
RETURN
END
这将返回一个记录集,其中包含
Element
a
b
c
注意:这个问题很旧,但还没有得到正确的回答,除了说除了添加一个排序列之外无法完成,这不是 OP 要求的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.