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
- Utilisation de
CommandType.StoredProcedure
est plus rapide. - 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.