SQL 服务器输出参数返回混合结果
SQL Server Output Parameter is returning mixed results
** 编辑 *****************
我从 GETDATE() 更改为 SYSDATETIME()。
我还将我的度量从毫秒更改为微秒。处理速度如此之快,以至于毫秒都无法测量。
我使用此代码的目的是计算传递到存储过程中的查询字符串的处理时间。查询字符串由用户创建,用户是参加 sql/database 课程的学生。在随后的查询中,将字符串与键进行比较,以确定它是否为分配产生了正确的结果。正如您将看到的,它是 VB.NET 代码(.NET 4.5 项目)调用 C# 方法(.NET 3.5 项目)调用存储过程(SQL SERVER 2012)。
我在主程序项目中的初始调用在这里:
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。当字符串不正确时,它 returns 一个介于 1.4 和 2.5 秒之间的值
这是我第一次使用带输出参数的存储过程。我没想到它会如此具有挑战性。
我是否忽略了一个可以使这项工作正常进行的简单细节?仅在 Stack Overflow 以及其他几个网站上,我已经尝试了至少五六个示例。你在这里看到的是我的最新版本。如果您需要更多信息,请告诉我。
如果您知道更好的方法,我愿意接受所有建议。
您的结果可能是正确的。如果您的 SQL SERVER 版本是 2008 或更高版本,请使用 SYSDATETIME() 而不是 GETDATE(),因为它具有更高的准确性(或分辨率)。否则,您可以多次尝试 运行 查询字符串,然后将结果除以运行次数。格式错误的查询字符串的执行时间应该被丢弃。
** 编辑 ***************** 我从 GETDATE() 更改为 SYSDATETIME()。 我还将我的度量从毫秒更改为微秒。处理速度如此之快,以至于毫秒都无法测量。
我使用此代码的目的是计算传递到存储过程中的查询字符串的处理时间。查询字符串由用户创建,用户是参加 sql/database 课程的学生。在随后的查询中,将字符串与键进行比较,以确定它是否为分配产生了正确的结果。正如您将看到的,它是 VB.NET 代码(.NET 4.5 项目)调用 C# 方法(.NET 3.5 项目)调用存储过程(SQL SERVER 2012)。
我在主程序项目中的初始调用在这里:
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。当字符串不正确时,它 returns 一个介于 1.4 和 2.5 秒之间的值
这是我第一次使用带输出参数的存储过程。我没想到它会如此具有挑战性。
我是否忽略了一个可以使这项工作正常进行的简单细节?仅在 Stack Overflow 以及其他几个网站上,我已经尝试了至少五六个示例。你在这里看到的是我的最新版本。如果您需要更多信息,请告诉我。
如果您知道更好的方法,我愿意接受所有建议。
您的结果可能是正确的。如果您的 SQL SERVER 版本是 2008 或更高版本,请使用 SYSDATETIME() 而不是 GETDATE(),因为它具有更高的准确性(或分辨率)。否则,您可以多次尝试 运行 查询字符串,然后将结果除以运行次数。格式错误的查询字符串的执行时间应该被丢弃。