Я искренне надеюсь, что опубликованная вами процедура не является той, которую вы используете в производственной среде, потому что она вообще не безопасна. Тот факт, что вы используете параметры, не означает, что вы защищены от SQL-инъекций - это то, как вы используете параметры. Эта процедура может быть написана без динамического SQL, который защитил бы ее от внедрения SQL следующим образом:
CREATE PROCEDURE [dbo].[USP_BusinessSearch]
@Product INT = NULL,
@BusinessName VARCHAR(100) = NULL
AS
SELECT *
FROM Business
WHERE ProductID = @Product
AND BusinessName = @BusinessName
Обратите внимание, что это не означает, что любой динамический SQL-подход уязвим для SQL-инъекций - вполне возможно предотвратить использование SQL-инъекций с использованием динамического SQL, если это необходимо:
CREATE PROCEDURE [dbo].[USP_BusinessSearch]
@Product INT = NULL,
@BusinessName VARCHAR(100) = NULL
AS
DECLARE @ParamDefinition AS NVARCHAR(MAX)
DECLARE @BaseQuery AS NVARCHAR(MAX)
SELECT @BaseQuery = N'Select * FROM Business WHERE ProductID = @Product AND BusinessName = @BusinessName',
@ParamDefinition = N'@Product INT, @BusinessName VARCHAR(100)'
EXEC SP_EXECUTESQL @BaseQuery, @ParamDefinition, @Product, @BusinessName
END
Ключевое различие между этим подходом и процедурой в вопросе состоит в том, что запрос в вопросе просто объединяет значения параметров в динамический SQL, делая его уязвимым для SQL-инъекций, тогда как процедуры в ответах используют параметры способ, которым они предназначены для использования - в качестве параметров.