Динамический SQL против параметризованного запроса - PullRequest
2 голосов
/ 07 января 2012

Является ли эта хранимая процедура динамическим SQL или параметризованным запросом?

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 07 января 2012
EXEC [dbo].[my_really_special_sp] @varchar1 @varchar2;

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

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

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

1 голос
/ 07 января 2012

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

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

Ни один изваши примеры соответствуют этим описаниям, потому что они оба являются простыми вызовами 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, чтобы закрыть уязвимость.Кроме этого, я не вижу ничего, что могло бы быть ошибочным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...