Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
С точки зрения производительности и вообще?
В случае, если параметры не надо передавать и получать...
20 июн 12, 12:20    [12744806]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Winnipuh, ну на пример
BOL
Примечание по безопасности.
Использование инструкции EXECUTE для выполнения строки облегчает атаки типа SQL
Injection. Вместо этого рекомендуется использовать инструкцию sp_executesql с параметрами.
20 июн 12, 12:26    [12744860]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
тоже из BOL
Для выполнения строки рекомендуется пользоваться не инструкцией EXECUTE, а хранимой процедурой sp_executesql. Она обладает большей функциональностью, поскольку поддерживает подстановку параметров, а также более эффективна, чем инструкция EXECUTE, поскольку создает планы выполнения, которые в SQL Server с большей вероятностью будут использоваться повторно.
20 июн 12, 12:28    [12744869]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
хмм, а вот что пишет одна тётя

http://www.sqlskills.com/BLOGS/KIMBERLY/post/EXEC-and-sp_executesql-how-are-they-different.aspx

------------
What I see more than anything are parameterized queries that when executed with sp_executesql are cached - and are essentially forced. And, they work just like stored procedures in that their plan is determined by the first execution. As a result, you can end up with a bad plan getting into cache and then being reused for subsequent executions. And, for the *EXACT* same statement executed with EXEC, SQL Server will ONLY parameterize and store a plan if it deems that plan as safe. For complex plans and those that have parameters that can effect optimization - EXEC will NOT save the plan. I have seen servers almost fall over because of poorly written procs and procs written with sp_executesql. The solution that ALWAYS works is a conversion to EXEC. Believe me, I still have a few more things to post and I'll show a few exact examples where sp_executesql does NOT work well and EXEC shines!
20 июн 12, 12:31    [12744898]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
Winnipuh,

http://dev.net.ua/blogs/denisreznik/archive/2009/07/15/8664.aspx
20 июн 12, 12:33    [12744909]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Winnipuh
С точки зрения производительности и вообще?
В случае, если параметры не надо передавать и получать...

если запрос не параметризован, то имхо все равно что.
20 июн 12, 12:34    [12744917]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Winnipuh
хмм, а вот что пишет одна тётя

http://www.sqlskills.com/BLOGS/KIMBERLY/post/EXEC-and-sp_executesql-how-are-they-different.aspx

------------
What I see more than anything are parameterized queries that when executed with sp_executesql are cached - and are essentially forced. And, they work just like stored procedures in that their plan is determined by the first execution. As a result, you can end up with a bad plan getting into cache and then being reused for subsequent executions. And, for the *EXACT* same statement executed with EXEC, SQL Server will ONLY parameterize and store a plan if it deems that plan as safe. For complex plans and those that have parameters that can effect optimization - EXEC will NOT save the plan. I have seen servers almost fall over because of poorly written procs and procs written with sp_executesql. The solution that ALWAYS works is a conversion to EXEC. Believe me, I still have a few more things to post and I'll show a few exact examples where sp_executesql does NOT work well and EXEC shines!

Напоминает param sniffing и решение с recompile.
20 июн 12, 12:38    [12744945]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
Помогите, пожалуйста, с таким вопросом.
Если есть необходимость одной и той же обработки(допустим операции UPDATE) для более чем одной таблицы имеющих полностью идентичную структуру. Как делать через EXEC все понятно, формируем в динамике запрос с необходимым именем таблицы и запускаем его. Но, судя по некоторым темам на форуме, тоже самое нельзя сделать через параметры sp_executesql где мне необходимо менять только имя таблицы в параметре. Правильно ли я понял?
20 июн 12, 13:19    [12745315]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Alexandr Kr.
Помогите, пожалуйста, с таким вопросом.
Если есть необходимость одной и той же обработки(допустим операции UPDATE) для более чем одной таблицы имеющих полностью идентичную структуру. Как делать через EXEC все понятно, формируем в динамике запрос с необходимым именем таблицы и запускаем его. Но, судя по некоторым темам на форуме, тоже самое нельзя сделать через параметры sp_executesql где мне необходимо менять только имя таблицы в параметре. Правильно ли я понял?

имхо если это не какая-то разовая административная задача, то использовать динамический sql неправильно, потому что таблицы уникальны и никто не даст гарантию, что их структура не изменится со временем. Возможно вообще множество таблиц с одинаковой структурой это ошибка проетирования и вам не хватает какого-нибудь поля вроде тип записи и всего одной таблицы вместо нескольких. Насчет sp_executesql название таблицы как параметр передавать нельзя.
20 июн 12, 13:31    [12745443]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше использовать в процедуре: sp_executesql или EXEC()?  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
Мистер Хенки,

Спасибо.
Насчет первой части. Это хранятся срезы данных которые потом собираются вьюхой в единый датасет.
Насчет второго я понял что фокус не пройдет.
20 июн 12, 13:33    [12745461]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить