SQL Server输出参数返回混合结果

时间:2015-05-05 03:04:21

标签: c# sql-server vb.net stored-procedures query-parameters

**编辑***************** 我从GETDATE()更改为SYSDATETIME()。 我还将测量值从毫秒改为微秒。处理过程如此之快,以至于毫秒无法测量它。

我对此代码的目标是计算传递给存储过程的查询字符串的处理时间。查询字符串由用户创建,学生参加sql / database课程。在随后的查询中,将字符串与密钥进行比较,以确定它是否为分配生成正确的结果。正如您所见,它的VB.NET代码(.NET 4.5项目)调用一个调用存储过程的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 个答案:

答案 0 :(得分:2)

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