2010-03-01 32 views
1
[email protected] bit) 
AS     
    SELECT 
.............. 

且僅當排序我想Order =真存儲過程:進行排序或不排序:選擇

如何我意識到了嗎?

謝謝。

+0

通常「no sort」=「按主鍵排序」。因此,首先根據@Sort設置某種@Sortkey,然後ORDER BY @Sortkey –

+0

ok ......謝謝大家^ _^ – Cynede

+0

@SF:無ORDER BY =沒有保證的順序。如果它與PK相匹配,那純粹是一致的,不能被依賴。 – gbn

回答

5
... 
ORDER BY 
    CASE 
     WHEN @sort = 1 THEN sortcolumn 
     ELSE 1 --constant value with same type of "sortcolumn" eg '19000101' or 'a' 
    END 
1

您測試@sort參數的值並相應地執行不同的查詢。

使用IF:

IF (@sort = 0) 
    SELECT... 
ELSE 
    SELECT... 
    ORDER BY .... 

使用CASE:

SELECT ... 
ORDER BY 
    CASE 
    WHEN @sort = 1 THEN xxx 
    ELSE 1 
    END 
+0

這是一個維護噩夢,除非你真的很好地評論它。總有人會改變一個分支,而不是另一個。 –

7

我沒想到這個工作,我必須承認,但它確實。在這個例子中,如果@sort設置爲true,我們會按城市排序,否則,我們使用其他一些默認排序(它必須與排序列的類型相同)。

DECLARE @sort bit 
SET @sort = 0 

SELECT [addressId] 
     ,[customerId] 
     ,[addressTypeId] 
     ,[address1] 
     ,[address2] 
     ,[address3] 
     ,[town] 
     ,[county] 
     ,[postcode] 
     ,[countryCode] 
FROM 
    [dbo].[tblAddress] 
ORDER BY 
    CASE 
     WHEN @sort = 1 THEN town 
     ELSE 'A' 
    END ASC 

根據評論建議進行編輯。

+1

而不是按您的ELSE子句中的主鍵進行排序,只需對某個固定值進行排序,如0或''。 –

+0

很棒的建議。我已經更新了答案以反映這個想法。 – Fenton

0

假設您正在使用SQL Server(一個很大的假設) - This post很好地描述了一種方法,以便使用動態sql(您幾乎可以肯定不應該這樣做b/c sql server將無法優化程序。

但是不管採取什麼方法,你爲什麼要這麼做?條件排序所增加的複雜性幾乎肯定不是最優的,編寫一個良好的存儲過程(使用合適的索引)總是返回排序數據。特別需要未排序的數據(並且即使您確實需要未排序的數據,也無法保證SQL無法爲您排序,因爲如果未指定排序,返回的行將處於非確定性順序)?