De acuerdo con las pruebas en esta publicación de blog, SQL Server hará la parametrización por usted, envolviendo su declaración en sp_executesql, cuando use CommandType.Text
. Pero cuando usa CommandType.StoredProcedure
lo parametrizará y, por lo tanto, le ahorrará trabajo a la base de datos. El último método es más rápido.
Editar:
Configuración
Yo mismo hice algunas pruebas y estos son los resultados.
Cree este procedimiento:
create procedure dbo.Test
(
@Text1 varchar(10) = 'Default1'
,@Text2 varchar(10) = 'Default2'
)
as
begin
select @Text1 as Text1, @Text2 as Text2
end
Agregue un seguimiento usando SQL Server Profiler.
Y luego llámalo usando el siguiente código:
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"]);
}
}
}
}
}
}
}
Resultados
En ambos casos las llamadas se realizan mediante RPC.
Esto es lo que revela el rastreo usando CommandType.Text
:
exec sp_executesql N'dbo.Test',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'
Y aquí está el resultado usando CommandType.StoredProcedure
:
exec dbo.Test @Text1=N'Text1',@Text2=N'Text2'
Como puede ver, la llamada de texto está envuelta en una llamada a sp_executesql
para que quede correctamente parametrizado. Por supuesto, esto creará una ligera sobrecarga y, por lo tanto, mi declaración anterior de usar CommandType.StoredProcedure
es más rápido sigue en pie.
Otra cosa digna de mención, y que también es un factor decisivo aquí, es que cuando creé el procedimiento sin valores predeterminados, recibí el siguiente error:
Mensaje 201, nivel 16, estado 4, prueba de procedimiento, línea 0 Procedimiento o función 'Prueba' espera el parámetro '@Text1', que no se suministró.
La razón de esto es cómo la llamada a sp_executesql
se crea, como puede ver, los parámetros se declaran e inicializan, pero no se usan . Para que la llamada funcionara, debería haberse visto así:
exec sp_executesql N'dbo.Test @Text1, @Text2',N'@Text1 nvarchar(5),@Text2 nvarchar(5)',@Text1=N'Text1',@Text2=N'Text2'
Es decir, cuando estás usando CommandType.Text
tienes que agregar los parámetros al CommandText
a menos que siempre desee utilizar los valores predeterminados.
Entonces, para responder a tu pregunta
- Uso de
CommandType.StoredProcedure
es más rápido. - Si está utilizando
CommandType.Text
, entonces tendrá que agregar los nombres de los parámetros a la llamada al procedimiento a menos que desee que se usen los valores predeterminados.