簡體   English   中英

對存儲過程的結果進行排序

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

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