Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

संग्रहीत कार्यविधि को निष्पादित करते समय, CommandType.StoreedProcedure बनाम CommandType.Text का उपयोग करने का क्या लाभ है?

इस ब्लॉग पोस्ट में परीक्षण के अनुसार जब आप 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 . में जोड़ना होगा जब तक आप हमेशा डिफ़ॉल्ट मानों का उपयोग नहीं करना चाहते।

तो, आपके प्रश्न का उत्तर देने के लिए

  1. CommandType.StoredProcedure का उपयोग करना तेज़ है।
  2. यदि आप CommandType.Text का उपयोग कर रहे हैं , तो आपको प्रक्रिया में पैरामीटर नाम को कॉल में जोड़ना होगा जब तक कि आप डिफ़ॉल्ट मानों का उपयोग नहीं करना चाहते।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में डेटाबेस स्कीमा का उपयोग करना

  2. पदानुक्रमित डेटा की प्रतिलिपि बनाते समय अभिभावक-बाल संबंधों को सुरक्षित रखें

  3. SQL सर्वर (T-SQL) में विभाजन योजनाओं की सूची लौटाएँ

  4. JSON_MODIFY () SQL सर्वर में उदाहरण (T-SQL)

  5. मैंने SQL सर्वर ODBC ड्राइवर को अपग्रेड किया है और प्रदर्शन नकारात्मक रूप से प्रभावित हुआ है। मैं क्या कर सकता हूं?