sql >> Databasteknik >  >> RDS >> Sqlserver

När du kör en lagrad procedur, vad är fördelen med att använda CommandType.StoredProcedure jämfört med att använda CommandType.Text?

Enligt testerna i det här blogginlägget kommer SQL Server att göra parametreringen åt dig, genom att linda in ditt uttalande i sp_executesql, när du använder CommandType.Text . Men när du använder CommandType.StoredProcedure du kommer att parametrisera den och därmed spara en del arbete på databasen. Den senare metoden är snabbare.

Redigera:

Inställningar

Jag har själv gjort några tester och här är resultaten.

Skapa denna procedur:

create procedure dbo.Test
(
   @Text1 varchar(10) = 'Default1'
  ,@Text2 varchar(10) = 'Default2'
)
as
begin
   select @Text1 as Text1, @Text2 as Text2
end

Lägg till ett spår till det med SQL Server Profiler.

Och kalla det sedan med följande kod:

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"]);
                        }
                    }
                }
            }
        }
    }
}

Resultat

I båda fallen görs samtalen med RPC.

Här är vad spåret avslöjar med CommandType.Text :

exec sp_executesql N'dbo.Test',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'

Och här är resultatet med CommandType.StoredProcedure :

exec dbo.Test @Text1=N'Text1',@Text2=N'Text2'

Som du kan se är textanropet inkluderat i ett anrop till sp_executesql så att den är korrekt parametrerad. Detta kommer naturligtvis att skapa en liten overhead, och därmed mitt tidigare uttalande om att använda CommandType.StoredProcedure är snabbare står fortfarande.

En annan anmärkningsvärd sak, och som också är en slags deal breaker här, är att när jag skapade proceduren utan standardvärden fick jag följande fel:

Msg 201, Level 16, State 4, Procedure Test, Line 0 Procedur eller funktion 'Test' förväntar sig parametern '@Text1', som inte tillhandahölls.

Anledningen till detta är hur anropet till sp_executesql skapas, som du kan se är parametrarna deklarerade och initierade, men de används inte . För att samtalet skulle fungera borde det ha sett ut så här:

exec sp_executesql N'dbo.Test @Text1, @Text2',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'

Det betyder, när du använder CommandType.Text du måste lägga till parametrarna i CommandText såvida du inte alltid vill att standardvärdena ska användas.

Så, för att svara på din fråga

  1. Med CommandType.StoredProcedure är snabbare.
  2. Om du använder CommandType.Text , då måste du lägga till parameternamnen i anropet till proceduren om du inte vill att standardvärdena ska användas.


  1. Visa data från databasen med basadapter och listview

  2. Oracle-klientinstallationsfel - sökvägen för lång

  3. importera redan skapad SQLite-databas (xamarin)

  4. Installera icu4c version 63 med Homebrew