我有一个雇员表,其中有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) = '',
我想构建一个动态性足以仅查询提供的值的查询。
答案 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'