根據this blog post中的測試,當您使用CommandType.Text
時,SQL Server將通過將語句包裝在sp_executesql中來爲您執行參數化。但是當你使用CommandType.StoredProcedure
時,你將參數化它,從而保存數據庫的一些工作。後一種方法更快。
編輯:
設置
我已經做了一些測試,我和這裏的結果。
創建此過程:
create procedure dbo.Test
(
@Text1 varchar(10) = 'Default1'
,@Text2 varchar(10) = 'Default2'
)
as
begin
select @Text1 as Text1, @Text2 as Text2
end
添加跟蹤到它使用SQL Server Profiler。
然後調用它使用下面的代碼:
using System;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication2
{
class Program
{
static void Main()
{
CallProcedure(CommandType.Text);
CallProcedure(CommandType.StoredProcedure);
}
private static void CallProcedure(CommandType commandType)
{
using (SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=Test;Integrated Security=SSPI;"))
{
connection.Open();
using (SqlCommand textCommand = new SqlCommand("dbo.Test", connection))
{
textCommand.CommandType = commandType;
textCommand.Parameters.AddWithValue("@Text1", "Text1");
textCommand.Parameters.AddWithValue("@Text2", "Text2");
using (IDataReader reader = textCommand.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["Text1"] + " " + reader["Text2"]);
}
}
}
}
}
}
}
結果
在這兩種情況下,調用使用RPC製成。
下面介紹一下跟蹤顯示使用CommandType.Text
:
exec sp_executesql N'dbo.Test',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'
這裏是使用CommandType.StoredProcedure
結果:
exec dbo.Test @Text1=N'Text1',@Text2=N'Text2'
正如你所看到的文字呼叫被包裹在一個呼叫sp_executesql
如此它是正確參數化的。這當然會造成輕微的開銷,因此我以前的說法使用CommandType.StoredProcedure
更快。
另一個值得注意的事情,並且這裏也是那種一個大忌,就是當我創建的過程,而不默認值,我得到了以下錯誤:
Msg 201, Level 16, State 4, Procedure Test, Line 0 Procedure or function 'Test' expects parameter '@Text1', which was not supplied.
這樣做的原因是如何調用至sp_executesql
已創建,因爲您可以看到參數已聲明和初始化,但它們未使用。對於呼叫工作,它應該是這個樣子的:
exec sp_executesql N'dbo.Test @Text1, @Text2',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'
意思是,當你使用CommandType.Text
您必須將參數添加到CommandText
除非你總是希望使用默認值。
因此,要回答你的問題
- 使用
CommandType.StoredProcedure
更快。
- 如果您使用的是
CommandType.Text
,那麼您必須將參數名稱添加到對過程的調用中,除非要使用默認值。
-So使用StoredProcedure可能會更快嗎? – MAW74656 2012-02-13 20:48:04
@ MAW74656是的。另請注意,Panagiotis Kanavos回答說,除了SQL Server之外,可能還有其他提供者不知道您正在嘗試執行proc,除非您指定它。 – 2012-02-13 21:34:48
- 我明白關於其他提供者的觀點,只是這個應用程序不太可能需要這種改變。還有很多商業企業應用程序要求您使用SQL Server(任何特定的數據庫服務器),我敢打賭他們不在那裏使用提供程序工廠。 – MAW74656 2012-02-13 21:44:13