इस ब्लॉग पोस्ट में परीक्षण के अनुसार जब आप CommandType.Text
का उपयोग करते हैं, तो SQL सर्वर आपके कथन को 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 सर्वर प्रोफाइलर का उपयोग करके इसमें एक ट्रेस जोड़ें।
और फिर निम्न कोड का उपयोग करके इसे कॉल करें:
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, लेवल 16, स्टेट 4, प्रोसीजर टेस्ट, लाइन 0 प्रोसीजर या फंक्शन 'टेस्ट' पैरामीटर '@ टेक्स्ट 1' की अपेक्षा करता है, जिसकी आपूर्ति नहीं की गई थी।
इसका कारण यह है कि 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
का उपयोग कर रहे हैं , तो आपको प्रक्रिया में पैरामीटर नाम को कॉल में जोड़ना होगा जब तक कि आप डिफ़ॉल्ट मानों का उपयोग नहीं करना चाहते।