[英]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.