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