Динамический запрос (в хранимой процедуре) на основе предоставленных параметров (SQL Server 2016) - PullRequest
0 голосов
/ 28 мая 2019

У меня есть таблица сотрудников, которая имеет более 30 столбцов. Эта таблица предоставляется веб-службой через хранимую процедуру, которая возвращает всех пользователей.

Мне нужно создать новую хранимую процедуру, которая позволяет искать по 6 конкретным столбцам. У меня есть эти столбцы в качестве входных параметров для хранимой процедуры, но я не уверен, как создать запрос, который использует только переданные параметры.

Например:

exec SearchUsers @firstName = 'John', @department = 'Admin'

должен выполнять запрос только по этим столбцам. Тем не менее, есть 5 доступных параметров, которые можно передать.

Вот мои параметры

@lastName nvarchar(255) = '',
@firstName nvarchar(255)  = '',
@office nvarchar(50)  = '',
@department nvarchar(50)  = '',
@language nvarchar(255)  = '',
@jobTitle nvarchar(255) = '',

Я хочу создать запрос, который будет достаточно динамичным, чтобы запрашивать только предоставленные значения.

Ответы [ 3 ]

0 голосов
/ 28 мая 2019

Таким образом, вы можете изменить параметры на «ноль» по умолчанию

@lastName nvarchar(255) = null,
@firstName nvarchar(255)  = null,
@office nvarchar(50)  = null,
@department nvarchar(50)  = null,
@language nvarchar(255)  = null,
@jobTitle nvarchar(255) = null,

Затем в предложении where проверьте наличие NULL, прежде чем сравнивать значение с соответствующим полем.

where (@lastName is null or lastname = @lastName)
and (@firstName is null or firstName = @firstName)
and (@office is null or office = @office)
and (@department is null or department = @department)
and (@language is null or language = @language)
and (@jobTitle is null or jobTitle = @jobTitle)
0 голосов
/ 29 мая 2019

вот пример:

Create PROCEDURE [dbo].[SearchUsers] ( 

@lastName Varchar(255) = '',
@firstName Varchar(255)  = '',
@office Varchar(50)  = '',
@department Varchar(50)  = '',
@language Varchar(255)  = '',
@jobTitle Varchar(255) = ''

AS

Set Nocount On

Select lastname,firstname,office,departament,language,jobtitle From Users (Nolock)
Where
lastname Like Case When @lastName <> '' Then @lastName Else lastname End
And firstname Like Case When @firstName <> '' Then @firstName Else firstname End
And office Like Case When @office <> '' Then @office Else office End
And departament Like Case When @department <> '' Then @department Else departament End
And language Like Case When @jobTitle <> '' Then @jobTitle Else jobtitle End

Set Nocount Off


exec SearchUsers @firstName = 'John', @department = 'Admin'
0 голосов
/ 28 мая 2019

В предложении where, помимо вашего обычного условия, для каждого параметра нужно просто добавить условие OR @param1 IS NULL.Поэтому, если параметр равен нулю, все условие будет «проигнорировано», поскольку оно всегда будет истинным.

...