**編輯***************** 我從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