2015-05-05 83 views
1

**编辑***************** 我从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上单独尝试了至少五六个示例 - 以及其他几个网站。你在这里看到的是我最近的一次迭代。如果您需要更多信息,请告诉我。

如果你知道更好的方式做到这一点,我愿意接受任何和所有的建议。

+1

为什么不使用C#代码调用时间,而是使用秒表而不是SQL中的out参数? –

+0

这是我最初的建议,但我被要求在存储过程中完成它。 – gdeck

回答

2

您的结果可能是正确的。如果您的SQL SERVER版本是2008或更高版本,请使用SYSDATETIME()而不是GETDATE(),因为它具有更高的准确性(或分辨率)。否则,您可以尝试多次运行查询字符串,然后将结果除以运行次数。应该放弃从格式错误的查询字符串执行时间。

+0

圣洁的废物,老兄!更改为SYSDATETIME()给了我第一个非0响应。这是13毫秒。此外,你提出了一个很好的观点。通过声明这可能是正确的,你给了我将度量从毫秒改为微秒的想法。果然,这发生得如此之快,以至于我无法以毫秒为单位进行测量。荣誉和感谢你结束了数小时的痛苦和痛苦:-) – gdeck

+1

乐于帮助。但是,请注意,您的代码容易受到SQL注入的影响。在测量执行时间后,您至少需要将用户输入包含在事务中并进行回滚。考虑像“DELETE Transactions”这样的查询可能对你的数据库做什么! – JohnS

+0

该字符串在提交到存储过程进行处理之前已经过彻底分析。这是一个学生的系统,所以将他们的输入作为查询字符串处理是一个必要的罪恶。 – gdeck

相关问题