2012-01-07 2 views
2

Рассматривается ли эта хранимая процедура Dynamic SQL или Parameterized query?Динамический SQL vs Параметрированный запрос

CREATE PROCEDURE [dbo].[my_dodgy_sp] 
    @varchar1 varchar(50), 
    @varchar2 varchar(50) 
AS 
BEGIN 
    ... 

    EXEC [dbo].[my_really_special_sp] @varchar1 @varchar2; 
END 

Дополнительные шоколадные пончики с вишней на вершине, если вы можете сказать мне это ли Dynamic/параметризованные:

CREATE PROCEDURE [dbo].[my_super_dodgy_sp] 
    @varchar1 varchar(50), 
    @varchar2 varchar(50), 
    @stored_procedure_name sysname 
AS 
BEGIN 
    ... 

    EXEC @stored_procedure_name @varchar1 @varchar2; 
END 
+0

Чтобы сделать супер изворотливый sp менее изворотливым, вы можете добавить некоторую проверку, чтобы убедиться, что @spname является «законным». – MatBailie

+0

Здесь я смущаюсь. Поскольку супер хитрость просто использует параметры, возможно, это параметризованный запрос, и в этом случае вы не можете вводить код SQL. Так что это не изворотливое, и вам не нужна проверка. – icc97

+1

Вы не можете вводить код с помощью 'EXEC @sp @ param'. Вы можете указывать только ссылку на другой СП. Это тонко отличается. Я не совсем согласен с ответом dknaack, поэтому добавил свой собственный. Надеюсь, это поможет :) – MatBailie

ответ

1

«Динамический SQL» означает создание программных запросов SQL Query String. Например, добавление объединений, создание предложения where и т. Д.

Параметрированные запросы - это строки SQL Query, содержащие переменные, значения которых предоставляются отдельно от строки SQL Query.

Ни один из ваших примеров не подходит для этих описаний, поскольку они являются как простыми вызовами T-SQL в пределах хранимых процедур.


Это может показаться педантом, но если ваше приложение вызывает 'EXEC [dbo].[my_really_special_sp] @varchar1 @varchar2', то что является параметризованных запросов.

И если ваш SP называет sp_executesql 'EXEC [dbo].[my_really_special_sp] @var1 @var2', @var1 = 1, @var2 = 10 тогда ...

  • sp_executesql является T-SQL вызов
  • 'EXEC [dbo].[my_really_special_sp] @var1 @var2' Ваш запрос параметризованных
  • @var1 = 1, @var2 = 10 Ваши параметры


Важным моментом является то, что ваши примеры являются предварительно скомпилированными операторами в SP , Примеры, которые я попытался объяснить, - это строки, которые передаются SQL Server для анализа, компиляции и выполнения.

Если эта строка составлена ​​программно по частям, это динамический sql.

Если эта строка содержит ссылки на переменные, которые поставляются отдельно, она параметризуется.


Я надеюсь, что это поможет, хотя я вижу, что это может показаться субъективным.


Что касается вашего стиля программирования. У вашего второго SP есть незначительная «уязвимость», поскольку если у пользователя есть доступ к нему, у них есть доступ ко всем другим SP с той же самой сигнатурой, даже если у этого пользователя обычно нет доступа. Это может быть преднамеренным и/или вы можете подтвердить параметр @spname, чтобы закрыть эту уязвимость. Кроме этого, я ничего не вижу, что может быть обвинено.

+0

Блестящий, я люблю педантичный, он решает много путаницы :) Это, безусловно, самое четкое описание разницы. – icc97

2
EXEC [dbo].[my_really_special_sp] @varchar1 @varchar2; 

Не является параметризованных запросов, это обычный вызов хранимая процедура.

Это зависит от содержания [my_really_special_sp], если это приведет к параметризованному запросу.

Просьба предоставить более подробную информацию, я хотел бы помочь вам гораздо больше.

+0

Спасибо @dknaack, извините за туманность, но я пытаюсь выяснить, есть ли серьезные проблемы с моим стилем программирования. Вообще-то my_really_special_sp будет что-то вроде 'UPDATE [my_table] SET [field1] = @ varchar1 WHERE [field2] = @ varchar2' – icc97

+0

У меня есть версия его работы да, и никаких манипуляций нет. Является 'UPDATE [my_table] SET [field1] = @ varchar1 WHERE [field2] = @ varchar2' параметризованный запрос? – icc97

+0

Вы должны использовать первый подход для лучшей читаемости, лучшего тестирования и самой важной вещи ... меньше звонков (более высокая производительность). – dknaack

Смежные вопросы