Чи можна налаштувати / використовувати sp_executesql за замовчуванням?


10

Я переглядаю додаток, який використовує високодинамічні запити sql проти SQL Server. Дивлячись на запити, побудовані дуже дивними та складними способами, але це вже інша історія, я розповідаю це, щоб дати вагому причину тому, що я не в змозі (занадто дурно) знайти речі сам ... я не бачу будь-який код, куди запитуються запити sp_executesql.

Але коли я простежу, я бачу багато запитів, що надходять із обгорнутою sp_executesql. Все рішення програми навіть зовсім не містить команди sp_executesql.

Тож я поцікавився, чи існує така конфігурація, яку я ще не знаю, що змушує програмне забезпечення обробляти запити за замовчуванням sp_executesql?

Що може спричинити таку поведінку?

Відповіді:


11

Причина, через яку загортаються оператори 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.


5

Якщо це програма .NET, то, швидше за все, це результат виклику SqlCommand.ExecuteReader () . Відповідно до головної сторінки класу SqlCommand , у сітці описів методів у розділі "Зауваження" під ExecuteReader написано:

Виконує команди, що повертають рядки. Для підвищення продуктивності ExecuteReader викликає команди, використовуючи збережену процедуру системи Transact-SQL sp_executesql . Отже, ExecuteReader може не мати ефекту, який потрібно, якщо він використовується для виконання команд, таких як оператори Transact-SQL SET.

Зараз у мене немає часу перевірити це, щоб підтвердити їх опис, але це повинно бути досить легко створити простий консольний додаток, який виконує дуже простий дзвінок, передаючи текст тексту запиту, включаючи параметр, який постачається з SqlParameter. Я думаю, що ExecuteNonQueryі ExecuteScalarвикористовувати , sp_executesqlтак як вони дозволяють також для передачі в параметрах, так чому б там бути інший шлях для того, як ті , які виконуються?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.