2015-05-05 123 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

相關問題