該方案首先運行昂貴的排序查詢並將第一個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參數將其傳遞給存儲過程。事實上,馬丁在評論中說了什麼,但是在我理解他的話之前進行了一些研究。
你的(分類100 PK的列表)的意思是,這可能是一個序列,如(5,1,9,2,8 ),並且你需要在外部選擇中保留這個相同的順序? – StuartLC
你在什麼版本的SQL Server? –
@Martin SQL 2008 R2 – Paparazzi