Menurut tes di posting blog ini SQL Server akan melakukan parameterisasi untuk Anda, dengan membungkus pernyataan Anda dalam sp_executesql, ketika Anda menggunakan CommandType.Text
. Tetapi ketika Anda menggunakan CommandType.StoredProcedure
Anda akan membuat parameter dan dengan demikian menyimpan database beberapa pekerjaan. Metode terakhir lebih cepat.
Sunting:
Penyiapan
Saya telah melakukan beberapa tes sendiri dan inilah hasilnya.
Buat prosedur ini:
create procedure dbo.Test
(
@Text1 varchar(10) = 'Default1'
,@Text2 varchar(10) = 'Default2'
)
as
begin
select @Text1 as Text1, @Text2 as Text2
end
Tambahkan jejak ke sana menggunakan SQL Server Profiler.
Dan kemudian panggil menggunakan kode berikut:
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"]);
}
}
}
}
}
}
}
Hasil
Dalam kedua kasus, panggilan dilakukan menggunakan RPC.
Inilah yang ditunjukkan oleh jejak menggunakan CommandType.Text
:
exec sp_executesql N'dbo.Test',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'
Dan inilah hasilnya menggunakan CommandType.StoredProcedure
:
exec dbo.Test @Text1=N'Text1',@Text2=N'Text2'
Seperti yang Anda lihat, panggilan teks dibungkus dengan panggilan ke sp_executesql
sehingga parameternya benar. Ini tentu saja akan membuat sedikit overhead, dan dengan demikian pernyataan saya sebelumnya yang menggunakan CommandType.StoredProcedure
lebih cepat masih berdiri.
Hal penting lainnya, dan yang juga merupakan pemecah kesepakatan di sini, adalah ketika saya membuat prosedur tanpa nilai default, saya mendapatkan kesalahan berikut:
Msg 201, Level 16, State 4, Procedure Test, Line 0 Procedure orfunction 'Test' mengharapkan parameter '@Text1', yang tidak diberikan.
Alasan untuk ini adalah bagaimana panggilan ke sp_executesql
dibuat, seperti yang Anda lihat parameter dideklarasikan dan diinisialisasi, tetapi tidak digunakan . Agar panggilan berfungsi, seharusnya terlihat seperti ini:
exec sp_executesql N'dbo.Test @Text1, @Text2',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'
Artinya, saat Anda menggunakan CommandType.Text
anda harus menambahkan parameter ke CommandText
kecuali jika Anda selalu ingin nilai default digunakan.
Jadi, untuk menjawab pertanyaan Anda
- Menggunakan
CommandType.StoredProcedure
lebih cepat. - Jika Anda menggunakan
CommandType.Text
, maka Anda harus menambahkan nama parameter ke panggilan ke prosedur kecuali jika Anda ingin nilai default digunakan.