La razón por la que se envuelven las sentencias SQL sp_executesql
es la configuración de la SqlCommand.Commandtype
propiedad y pasar los parámetros al comando.
SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
El código anterior termina con este T-SQL:
exec proc1 @param1=1
SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
Este código termina con la ejecución del siguiente T-SQL:
exec sp_executesql N'proc1',N'@param1 int',@param1=1
Adición 23.12.15: Al usar un CommandType.Text
comando, los resultados son similares: tan pronto como se agrega un parámetro al objeto de comando, .NET ajustará toda la consulta sp_executesql
y le pasará los parámetros.
Adición: después de profundizar más sp_executesql
, la detección de parámetros y el almacenamiento en caché de planes de este comportamiento de las clases .NET tiene sentido para evitar una compilación de consultas frecuentes y una gran cantidad de planes. Por lo tanto, está diseñado básicamente para garantizar un mejor rendimiento de SQL Server en general, mientras que al mismo tiempo podría conducir a un bajo rendimiento de algunas consultas (problema de detección de parámetros) que se utilizan con valores de parámetros diferentes que el plan de consulta creado inicialmente.
Ver:
Los ejemplos anteriores se crearon con .NET Framework 4.5 y SQL Server 2008 Developer Edition.