this blog post में परीक्षणों के मुताबिक SQL सर्वर sp_executesql में अपना कथन लपेटकर, पैरामीटरकरण करेगा, जब आप CommandType.Text
का उपयोग करते हैं। लेकिन जब आप CommandType.StoredProcedure
का उपयोग करते हैं तो आप इसे पैरामीटर कर देंगे और इस प्रकार डेटाबेस को कुछ काम सहेज लेंगे। बाद की विधि तेज है।
संपादित करें:
सेटअप
मैं कुछ परीक्षण अपने आप को किया जाता है और यहां गए परिणाम हैं।
इस प्रक्रिया बनाएं:
create procedure dbo.Test
(
@Text1 varchar(10) = 'Default1'
,@Text2 varchar(10) = 'Default2'
)
as
begin
select @Text1 as Text1, @Text2 as Text2
end
इसे करने के लिए एक निशान जोड़े एसक्यूएल सर्वर प्रोफाइलर का उपयोग कर।
और फिर निम्नलिखित कोड का उपयोग कर इसे कहते:
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"]);
}
}
}
}
}
}
}
परिणाम
दोनों ही मामलों कॉल आरपीसी का उपयोग किया जाता है।
यहाँ क्या पता लगाने 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
का उपयोग कर रहे हैं, तो आप जब तक आप मूलभूत मूल्यों में इस्तेमाल किया जा करना चाहते प्रक्रिया के लिए कॉल करने के लिए पैरामीटर का नाम जोड़ने की करनी होगी।
- स्टोर्डप्रोसेसर का उपयोग करने से भी तेज हो सकता है? – MAW74656
@ MAW74656 हां। यह भी ध्यान दें कि Panagiotis Kanavos का उत्तर है कि SQL सर्वर के अलावा अन्य प्रदाता हो सकते हैं, जो यह नहीं समझते कि आप एक proc निष्पादित करने का प्रयास कर रहे हैं जब तक कि आप इसे निर्दिष्ट न करें। –
- मैं अन्य प्रदाताओं के बारे में बिंदु को समझता हूं, यह सिर्फ इतना है कि इस एप्लिकेशन को उस तरह के परिवर्तन की आवश्यकता होने की संभावना नहीं है। और ऐसे कई वाणिज्यिक एंटरप्राइज़ एप्लिकेशन हैं जिनके लिए आप SQL सर्वर (किसी भी विशिष्ट डेटाबेस सर्वर) का उपयोग करते हैं, और मैं शर्त लगाता हूं कि वे वहां प्रदाता कारखाने का उपयोग नहीं करते हैं। – MAW74656