Причина, через яку загортаються оператори SQL, sp_executesql
- це встановлення SqlCommand.Commandtype
властивості та передача будь-яких параметрів команді.
SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
Код вище закінчується цим 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();
Цей код закінчується виконанням наступного T-SQL:
exec sp_executesql N'proc1',N'@param1 int',@param1=1
Додавання 23.12.15: Використовуючи CommandType.Text
команду, результати схожі: Як тільки параметр буде доданий до об'єкта команди, .NET оберне весь запит sp_executesql
і передасть йому параметри.
Додавання: Після заглиблення вглиб sp_executesql
, нюхання параметрами та кешування планів такої поведінки класів .NET має цілком сенс, щоб уникнути частого складання запитів та кількості планів. Таким чином, він в основному призначений для забезпечення кращої продуктивності SQL Server в цілому, в той же час це може призвести до низької продуктивності деяких запитів (питання обнюхування параметрів), які використовуються з іншими значеннями параметрів, ніж початковий створений план запитів.
Подивитися:
Вищевказаний зразок був створений за допомогою .NET Framework 4.5 та SQL Server 2008 Developer Edition.