**编辑***************** 我从GETDATE()改变到SYSDATETIME()。 我也将我的测量从毫秒改为微秒。处理过程发生得如此之快以至于毫秒无法测量。SQL服务器输出的参数返回不同的结果
我的这段代码的目标是计算传递到存储过程的查询字符串的处理时间。查询字符串是由用户创建的,学生参加sql /数据库课程。在随后的查询中,将字符串与键进行比较以确定它是否为分配生成正确的结果。正如你所看到的,它是VB.NET代码(.NET 4.5项目),它调用一个调用存储过程(SQL SERVER 2012)的C#方法(.NET 3.5项目)。
我从主程序项目初始呼叫是在这里:
Dim executionTime As Integer = exercise.GetSqlTime(txtUserSQL, connectionString)
调用的方法是在这里:
public int GetSqlTime(string SqlString, string ConnectionString)//bookmark
{
int executionTime = 0;
SqlConnection con = new SqlConnection(ConnectionString);
using (SqlCommand cmd = new SqlCommand("QueryExecutionTime", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@UserSQLstring", SqlDbType.NVarChar).Value = SqlString;
cmd.Parameters.Add("@Duration", SqlDbType.Int);
cmd.Parameters["@Duration"].Direction = ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
executionTime = Convert.ToInt32(cmd.Parameters["@Duration"].Value);
}
return executionTime;
}
我的存储过程是在这里:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[QueryExecutionTime]
@UserSQLstring NvarChar(3000),
@Duration int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @StartTime datetime = GETDATE()
EXEC sp_executesql @UserSQLstring
DECLARE @EndTime datetime = GETDATE()
SET @Duration = DATEDIFF(MILLISECOND,@StartTime,@EndTime)
END
当查询字符串正确时,结果为0。当字符串是不正确,它和1.4秒
之间2.5
这是我第一次使用存储的过程与输出参数返回一个值。我不知道它会被证明是如此具有挑战性。我是否忽略了一个简单的细节,可以使其正确工作?我已经在Stack Overflow上单独尝试了至少五六个示例 - 以及其他几个网站。你在这里看到的是我最近的一次迭代。如果您需要更多信息,请告诉我。
如果你知道更好的方式做到这一点,我愿意接受任何和所有的建议。
为什么不使用C#代码调用时间,而是使用秒表而不是SQL中的out参数? –
这是我最初的建议,但我被要求在存储过程中完成它。 – gdeck