簡體   English   中英

從表值 function 返回的訂購結果

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM