[英]Sorting the result of a stored procedure
我想在存儲過程的結果中對列進行排序,而不必在存儲過程中添加Order By子句。 我不希望在執行查詢后對數據進行排序,如果可能,排序應該是查詢的一部分。 我有以下代碼:
public static DataTable RunReport(ReportQuery query)
{
OffertaDataContext db = new OffertaDataContext();
Report report = (from r in db.Reports where r.Id == (int)query.ReportId select r).Single();
//???: check security clearance.
DataSet dataSet = new DataSet();
/*
doesn't work, I guess the "Result" table hasn't been created yet;
if(!string.IsNullOrEmpty(query.SortField))
{
dataSet.DefaultViewManager.DataViewSettings["Result"].Sort = query.SortField + " " + (query.SortAscending ? "ASC" : "DESC");
}
*/
using (SqlConnection conn = new SqlConnection(Config.ConnectionString))
{
conn.Open();
using (SqlCommand exec = conn.CreateCommand())
{
using (SqlDataAdapter adapter = new SqlDataAdapter())
{
exec.Connection = conn;
exec.CommandType = CommandType.StoredProcedure;
exec.CommandText = report.ReportProc;
adapter.SelectCommand = exec;
try
{
adapter.Fill(dataSet, query.Skip, query.Take, "Result");
}
catch (Exception e)
{
throw e;
}
finally
{
conn.Close();
}
return dataSet.Tables["Result"];
}
}
}
}
如何添加排序?
獲取您在dataSet中填充的DataTable(“Result”)。
現在 - 除了通過填充它的查詢,視圖或存儲過程之外,沒有辦法對DataTable進行排序。
由於您不想在SP中執行此操作,因此可以對DataTable的DefaultView或與DataTable關聯的任何DataView進行排序。
您可以使用DataView的Sort屬性來實現它。 這是一個字符串,它指定要排序的列(或列)和順序(ASC或DESC)。
例:
myTable.DefaultView.Sort = "myColumn DESC";
您現在可以使用DefaultView執行任何操作(將其綁定到某些內容或其他內容)
說實話,既然您正在使用DataTable,那么您也可以在客戶端進行排序。
通過SP等動態排序(在服務器上)總是很痛苦; 要在純TSQL中執行它,您需要在SELECT結束時使用一些非常低效的CASE塊,或者您需要使用動態SQL(例如通過sp_ExecuteSQL),在最終查詢中操作ORDER BY。 唯一的另一個選擇(在原始TSQL中)是EXEC / INTO將數據放入表變量(或臨時表),然后使用ORDER BY從中獲取SELECT。
如果它是一個選項,LINQ-to-SQL實際上就可以了; 它支持查詢(和編寫)UDF - 因此,而不是SP,在UDF中編碼查詢(如果您需要支持傳統調用者,SP始終只能從UDF中進行SELECT)。 然后你可以在LINQ查詢中使用“order by”等:
var qry = from row in ctx.SomeMethod(args)
order by row.Name, row.Key
select row;
(或者有各種方法為LINQ查詢添加動態排序 - 上面只是一個簡單的例子)
最終的TSQL將是這樣的:
SELECT blah FROM theudf(args) ORDER BY blah
即它會正確,並在服務器上執行“ORDER BY”。 當與Skip()
和Take()
以獲取分頁數據時,這尤其有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.