«Динамический 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, чтобы закрыть эту уязвимость. Кроме этого, я ничего не вижу, что может быть обвинено.
Чтобы сделать супер изворотливый sp менее изворотливым, вы можете добавить некоторую проверку, чтобы убедиться, что @spname является «законным». – MatBailie
Здесь я смущаюсь. Поскольку супер хитрость просто использует параметры, возможно, это параметризованный запрос, и в этом случае вы не можете вводить код SQL. Так что это не изворотливое, и вам не нужна проверка. – icc97
Вы не можете вводить код с помощью 'EXEC @sp @ param'. Вы можете указывать только ссылку на другой СП. Это тонко отличается. Я не совсем согласен с ответом dknaack, поэтому добавил свой собственный. Надеюсь, это поможет :) – MatBailie