sql server中获取要执行的sql或sql块的执行时间,方法之一如下:
declare @begin datetime,@end datetimeset @begin =getdate()--your sqlset @end=getdate()PRINT DATEDIFF(millisecond, @begin, @end)/1000.0 --单位:s
测试执行getdate()方法要花多长时间:
declare @begin datetime,@end datetimeset @begin =getdate()select getdate()set @end=getdate()PRINT DATEDIFF(millisecond, @begin, @end)/1000.0 --单位:s
执行结果截图如下:
在消息中,可见执行getdate()方法的时间是极短,可以忽略不计!
下面,以查询我本地的[user]表为例进行测试:
执行后的当前时间减去执行前的当前时间,即为sql或sql块的执行用时。
项目中,程序想拿到这个时间,只需把这个sql块封装成一个存储过程,存储过程有一个output参数,
把最后一行的print换成赋值给output输出参数即可。
存储过程如下:
CREATE PROCEDURE GetExecuteTimeProc@executeTime decimal(18,3) output AS begin declare @begin datetime,@end datetime set @begin =getdate() select * from [user] waitfor delay'00:00:5'--暂停5秒,模拟查询 set @end=getdate() set @executeTime=cast((DATEDIFF(millisecond, @begin, @end)/1000.0) as decimal(18,3)) endGO
测试demo代码:
static void Main(string[] args) { string sql = "GetExecuteTimeProc"; SqlParameter[] parameters = { new SqlParameter("@executeTime",SqlDbType.Decimal){Direction=ParameterDirection.Output,Value=0} }; DataTable dt = DBHelper.ExecuteSelect(sql, parameters,CommandType.StoredProcedure).Tables[0]; decimal executeTime = Convert.ToDecimal(parameters[0].Value); int rowCount = 0; if (dt != null) { rowCount = dt.Rows.Count; } Console.WriteLine("一共有{0}行数据\n查询耗时{1}秒",rowCount,executeTime); Console.ReadKey(); }
DBHelper类:
public class DBHelper { public static DataSet ExecuteSelect(string sql, SqlParameter[] param, CommandType commandType) { string ConnectionString = Properties.Resources.conStr.ToString(); DataSet ds = new DataSet(); using (SqlConnection conn = new SqlConnection(ConnectionString)) { conn.Open(); using (SqlCommand cmd =new SqlCommand(sql,conn)) { try { cmd.CommandType=commandType; if (param != null) { foreach (var item in param) { cmd.Parameters.Add(item); } } SqlDataAdapter sda=new SqlDataAdapter(cmd); sda.Fill(ds); } catch (Exception ex) { throw; } } } return ds; } }
运行截图: