sql >> Base de Datos >  >> RDS >> Sqlserver

Al ejecutar un procedimiento almacenado, ¿cuál es el beneficio de usar CommandType.StoredProcedure en comparación con CommandType.Text?

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

  1. Uso de CommandType.StoredProcedure es más rápido.
  2. 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.