我有一个带有两个参数的存储过程,它返回给我的员工列表。我的存储过程工作正常,但我需要根据条件将条件放在我的where子句中。以下是我的存储过程:
create procedure sp_GetEmployees
@BranchId int = 0,
@DeptId int = 0
as
Begin
if(@BranchId > 0 and @DeptId > 0)
select * from Employees where BranchId = @BranchId and DeptId = @DeptId
else if (@BranchId > 0 and @DeptId = 0)
select * from Employees where BranchId = @BranchId
else if (@BranchId > 0 and @DeptId = 0)
select * from Employees where DeptId = @DeptId
else
select * from Employees
End
这是一个简单的案例,但我有更复杂的情况,我传递8到10个参数,为他们制定条件将是一个很大的麻烦。我需要在一个select语句中简化它。我尝试了以下但当然,这是不正确的:
if(@BranchId > 0 or @DeptId > 0)
select * from Employees where
case @BranchId when 0 then ''
else BranchId = @BranchId
End
else
select * from Employees
我该如何简化它?
您可以像下面这样简化查询。
SELECT *
FROM Employee
WHERE ( Branchid = @BranchId
OR @BranchId = 0 )
AND ( Deptid = @DeptId
OR @DeptId = 0 )
我会这样做,将OPTION (RECOMPILE)
添加到您的查询中;这意味着不会使用任何缓存的查询计划,因为它们对于一组不同的参数可能毫无用处(这是一个包罗万象的查询):
CREATE PROCEDURE sp_GetEmployees @BranchId int = 0,
@DeptId int = 0
AS
BEGIN
SELECT *
FROM Employees
WHERE (BranchId = @BranchId
OR @BranchId = 0)
AND (DeptId = @DeptId
OR @DeptId = 0)
OPTION (RECOMPILE);
END;
你试图像声明一样使用CASE
表达式,但事实并非如此。
你可以这样做:
WHERE (@Parameter1 = 0 OR Field1=@Parameter1)
AND (@Parameter2 = 0 OR Field2=@Parameter2)
AND ...
您可以像这样连接查询和条件检查:
ALTER PROCEDURE [dbo].[Your stored procedure name]
@aaa INT condition parameter,
@bbb INT condition parameter,
@ccc INT condition parameter,
@RecordCount INT OUTPUT
AS
Declare @aaa nvarchar(500)
Declare @bbb nvarchar(500)
Declare @ccc nvarchar(500)
BEGIN
BEGIN TRY
SET @qry = N'SELECT <here your query> where 1=1
'
IF @aaa= 0
BEGIN
SET @aaa = ''
END
ELSE
BEGIN
SET @aaa = ' and p.userid = '+CONVERT(varchar(5),@aaa)+' '
END
IF @bbb= 0
BEGIN
SET @bbb = ''
END
ELSE
BEGIN
SET @bbb = ' and p.Senderid = '+CONVERT(varchar(10),@bbb)+' '
END