Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Lors de l'exécution d'une procédure stockée, quel est l'avantage d'utiliser CommandType.StoredProcedure par rapport à CommandType.Text ?

Selon les tests de ce billet de blog, SQL Server effectuera le paramétrage pour vous, en enveloppant votre instruction dans sp_executesql, lorsque vous utilisez CommandType.Text . Mais lorsque vous utilisez CommandType.StoredProcedure vous le paramétrerez et économiserez ainsi du travail à la base de données. Cette dernière méthode est plus rapide.

Modifier :

Configuration

J'ai fait quelques tests moi-même et voici les résultats.

Créez cette procédure :

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

Ajoutez-y une trace à l'aide de SQL Server Profiler.

Et puis appelez-le en utilisant le code suivant :

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

Résultats

Dans les deux cas, les appels sont effectués à l'aide de RPC.

Voici ce que la trace révèle en utilisant CommandType.Text :

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

Et voici le résultat en utilisant CommandType.StoredProcedure :

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

Comme vous pouvez le voir, l'appel de texte est enveloppé dans un appel à sp_executesql afin qu'il soit correctement paramétré. Cela créera bien sûr une légère surcharge, et donc ma déclaration précédente selon laquelle l'utilisation de CommandType.StoredProcedure est plus rapide tient toujours debout.

Une autre chose remarquable, et qui est également une sorte de facteur décisif ici, est que lorsque j'ai créé la procédure sans valeurs par défaut, j'ai obtenu l'erreur suivante :

Msg 201, Level 16, State 4, Procedure Test, Line 0 Procedure oufunction 'Test' attend le paramètre '@Text1', qui n'a pas été fourni.

La raison en est la façon dont l'appel à sp_executesql est créé, comme vous pouvez le voir, les paramètres sont déclarés et initialisés, mais ils ne sont pas utilisés . Pour que l'appel fonctionne, il aurait dû ressembler à ceci :

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

Cela signifie que lorsque vous utilisez CommandType.Text vous devez ajouter les paramètres au CommandText sauf si vous souhaitez toujours utiliser les valeurs par défaut.

Donc, pour répondre à votre question

  1. Utilisation de CommandType.StoredProcedure est plus rapide.
  2. Si vous utilisez CommandType.Text , vous devrez alors ajouter les noms des paramètres à l'appel de la procédure, sauf si vous souhaitez que les valeurs par défaut soient utilisées.