Поскольку это запрос типа «поиск», который вы выполняете с переменным числом параметров, вам нужно постепенно наращивать строку - вы находитесь на правильных линиях, что она должна быть динамической, но вы также необходимо избегать атак с использованием SQL-инъекций (Google "Little Bobby Tables"). Таким образом, вам нужно использовать параметризованный динамический оператор SQL:
ALTER PROCEDURE [dbo].[GetEmployeeByParameters]
@FirstName VARCHAR(50)
AS
BEGIN
DECLARE @sql AS NVARCHAR(4000)
SET @sql = 'SELECT e.* FROM Employee e WHERE 1 = 1'
IF @FirstName IS NOT NULL
BEGIN
SET @sql = @sql + ' AND FirstName = @pFirstName'
END
-- More IF statements, building up the query
EXEC sp_ExecuteSQL @sql, N'@pFirstName VARCHAR(50)', @FirstName
Второй и третий параметры сопоставляют параметр @FirstName с «внутренними» параметрами запроса (который я обычно префиксирую с помощью «p» или «param», чтобы отличить их от собственных параметров хранимой процедуры).
Вы расширяете sp_Exceute соответствующим образом каждый раз, когда добавляете новый параметр для поиска, поэтому вы можете в конечном итоге выполнить:
EXEC sp_ExecuteSQL @sql,' N'
@pFirstName VARCHAR(50),
@pSurName VARCHAR(50),
@pDateOfBirth DATETIME', @FirstName, @Surname, @DateOfBirth