2012-03-27 25 views
1

我正在用C#編寫一個程序,它使用傳遞給sp_executesql的參數運行一些select語句。我在測試時遇到的一個問題是,無論是從SQL Profiler還是從Visual Studio中的監視中獲取執行的命令,都會在語句結尾指定參數的值,而不是顯式指定 - 在查詢中。出於測試目的,我希望能夠快速地將參數值替換爲參數。顯式替換sp_executesql語句中的參數的快速方法?

因此,而不是:

exec sp_executesql N' 
SELECT CustomerName 
FROM CustomerTable ct WITH(NOLOCK) 
WHERE ct.CustomerId <> @CustomerId 
AND ct.ItemId <> @ItemId 
AND ct.TransactionId = @TransactionId' 
,N'@CustomerId bigint,@ItemId nvarchar(1),@TransactionId nvarchar(30), @CustomerId = 3000, @ItemId = N'4', @TransactionId=N'43281' 

我想:

exec sp_executesql N' 
SELECT CustomerName 
FROM CustomerTable ct WITH(NOLOCK) 
WHERE ct.CustomerId = 3000 
AND ct.ItemId <> N'4' 
AND ct.TransactionId = N'43281'' 

請不要過多關注到的例子的語法,因爲它只是被用來演示概念。有沒有人知道一個快速的方法來做到這一點?基本上,我希望將其替換爲測試目的,因爲它會使我更容易修改條件來測試它們如何影響返回的結果。我希望任何人都可以提供幫助。謝謝。

+1

您可以手動遍歷參數列表並將其值粘貼到查詢中。否則,參數是在SQL引擎級別處理的優化,無法獲取SQL用於處理的內部查詢。你能提供你用來生成動態sql命令的C#代碼嗎? – mellamokb 2012-03-27 18:18:28

回答

3

參數sp_executesql的有很多好處,包括

  • 通過你給了SQL的機會緩存體面的查詢計劃上一定類型
  • 通過參數有助於防止像SQL注入攻擊髒東西明確的參數化,但也避免了逃避有問題的角色的需要。

所以,即使你設法「unparameterize」生成的sp_executesql的,如果執行內聯SQL,查詢計劃可能是顯著不同的參數化版本,你也需要做逃逸等(即它不適合蘋果和蘋果測試)。

我能想到爲什麼你不想要參數化的sp_executesql的唯一原因是爲了便於閱讀?

編輯:試圖替代將取決於你使用的是什麼技術

由於@mellamokb建議,如果您使用的ExecuteReader這可能是非常簡單

假設你的代碼是像

string sqlCmd = "SELECT CustomerName 
FROM CustomerTable ct WITH(NOLOCK) 
WHERE ct.CustomerId <> @CustomerId 
AND ct.ItemId <> @ItemId 
AND ct.TransactionId = @TransactionId"; 

cmd.CommandText = sqlCmd; 
cmd.CommandType = CommandType.Text; 
cmd.Parameters.Add(new SqlParameter("CustomerId", DbType.Int32, myCustomerId)); 
cmd.Parameters.Add(new SqlParameter("ItemId", DbType.String, myItemId)); 
.. 
cmd.ExecuteReader() 

然後,您可以添加代碼來構建測試查詢:

string sqlMyTest = sqlCmd.Replace("@CustomerId", myCustomerId.ToString()); 
sqlMyTest = sqlMyTest.Replace("@ItemId", specialEscapeFunction(myItemId)); 
.. do something with sqlMyTest 

但是像LINQ2SQL或EF的ORM不會那麼容易

customerTable.Where(c => (c.CustomerId != myCustomerId) && (c.ItemId != myItemId) && (c.TransactionId == myTransactionId)) 

可能像LinqPad的工具可以幫助?

+0

感謝您的回覆。是的,當我研究這個問題時,我閱讀了一些關於如何使用sp_executesql執行SQL命令在運行大量查詢時提供一定效率的方法。在內部,我想保持代碼相同。但是,如果僅僅是爲了測試,我希望能夠使用已經替換的參數來生成SQL命令。我是否可以暫時使用其他SQL命令(例如,使用sp_executesql,然後可能有另一個代碼塊會導致輸出更易於閱讀的表達式,以便稍後註釋)? – user1202747 2012-03-27 19:09:21

+0

謝謝,替換想法奏效。 – user1202747 2012-03-28 00:19:56