2011-09-22 31 views
1

該方案首先運行昂貴的排序查詢並將第一個100,000主鍵(Int32)保存在.NET列表中。然後從大約十幾張表中一次檢索100行。詳細查詢的格式爲:TSQL排序順序基於訂單In The Clalls

select ... from DetailA where PK in (sorted list of 100 PK). 

問題是返回沒有按in子句中的順序排序。需要對細節進行排序。不希望應用用於創建100,000個主列表的排序,因爲這是一種昂貴且雜亂的排序。

我的想法是將100 PK加載到#tempSort表中並將其用於排序。有更好的方法嗎?

當前使用SQLDataReader一次獲取一行的詳細信息,大約需要2秒鐘。經過測試,使用具有多個DataTable的DataSet一次性獲得全部數據,並且每次使用SQLDataReader的速度比一行慢。這些數據正在加載到對象中,因此需要DataSet的高級功能。

我不想將100,000個主結果保存在#temp中,因爲這是一個很大的活動數據庫,需要將負載移至客戶端。

按照建議嘗試表值參數。
這是正確的語法嗎?

CREATE TYPE sID100 AS TABLE 
    (sID INT, sortOrder INT); 
    GO 

    /* Declare a variable that references the type. */ 
    DECLARE @sID100 AS sID100; 

    /* Add data to the table variable. */ 
    INSERT INTO @sID100 (sID, sortOrder) 
    values (100, 1), (200,2), (50,3); 

    Select * from @sID100; 
    select docSVsys.sID, docSVsys.addDate 
    from docSVsys 
    join @sID100 as [sID100] 
    on [sID100].sID = docSVsys.sID 
    order by [sID100].sortOrder 
    GO 

    Drop TYPE sID100 

以上不是最優的。我正在學習,但在C#中可以創建一個DataTable並使用Tabel-Value參數將其傳遞給存儲過程。事實上,馬丁在評論中說了什麼,但是在我理解他的話之前進行了一些研究。

+1

你的(分類100 PK的列表)的意思是,這可能是一個序列,如(5,1,9,2,8 ),並且你需要在外部選擇中保留這個相同的順序? – StuartLC

+0

你在什麼版本的SQL Server? –

+0

@Martin SQL 2008 R2 – Paparazzi

回答

1

IN子句中PK的順序是不相關的。
只有最外層的ORDER BY事項:如果未指定

select ... 
from DetailA 
where PK in (sorted list of 100 PK) 
ORDER BY PK 
任何順序是任意的

From MSDN ORDER BY

當ORDER BY是在視圖的定義中使用,內聯函數,派生表,或子查詢該子句僅用於確定TOP子句返回的行。當查詢這些結構時,ORDER BY子句不保證排序結果,除非ORDER BY也在查詢本身中指定。

編輯,反饋後,包括馬丁·史密斯的想法

select ... 
from DetailA A 
    JOIN 
    TVPorTemptable T ON A.PK = T.PK 
ORDER BY 
    T.OrderByCOlumn 
+0

已排序的100 PK列表不是數字順序。對不起,我在問題陳述中並不清楚。 – Paparazzi

+0

這就是我認爲我需要做的事情,但有機會TSQL有一些我不知道的功能。問題陳述確實詢問是否有比#tempSort表更好的方法。讓我來看看這一天是否會出現一些技巧性的答案,然後再將其標記爲答案。 – Paparazzi