基于提供的参数的动态查询(在存储过程中)(SQL Server 2016)

时间:2019-05-28 17:13:04

标签: sql-server stored-procedures case

我有一个雇员表,其中有30多个列。 Web服务通过返回所有用户的存储过程公开此表。

我需要创建一个新的存储过程,使您可以搜索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 :(得分:0)

在where子句中,除了正常条件外,您只需为每个参数添加条件OR @param1 IS NULL。因此,如果参数为null,则由于将始终为真,因此整个条件将被“忽略”。

答案 1 :(得分:0)

因此您可以将参数默认更改为“空”

@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)

答案 2 :(得分:0)

这里是一个例子:

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'