如何在SQL Server存储过程中执行条件
问题描述:
我有一个存储过程,我需要在其中实现条件WHERE
子句。如何在SQL Server存储过程中执行条件
我有一个@name
参数,@startdate
和@enddate
参数。
我怎么能写条件:
- 如果
@name is null
和@startdate
&@enddate
给出然后日期范围返回数据。和 - 如果
@name
给出@startdate
&@enddate is null
然后名称返回数据 - 如果
@name
和@startdate
&@enddate
给出然后返回其中名称和日期范围进行评估数据
这是我目前的程序
alter procedure dbo.sp_emp
@name varchar(50),
@startdate date,
@enddate date
as
begin
select *
from employee
where
Name = @name
and dob between @startdate and @enddate
end
答
你可以这样来做:
DECLARE @query NVARCHAR(2048);
SET @query = 'select * from employee where Name = ''' + @name + '''';
IF @startdate IS NOT NULL AND @enddate IS NOT NULL
SET @query += ' AND dob between ''' + @startdate + ''' and ''' + @enddate '''';
EXECUTE(@query);
你应该照顾你的瓦尔有关SQL注入。
答
我认为COALESCE
可以解决您的问题。
alter procedure dbo.sp_emp
@name varchar(50),
@startdate date,
@enddate date
as
begin
select *
from employee
where Name = (COALESCE(@name, name))
AND dob between COALESCE(@startdate, dob) and COALESCE(@enddate, dob)
end
ISNULL版本
alter procedure dbo.sp_emp
@name varchar(50),
@startdate date,
@enddate date
as
begin
select *
FROM employee
WHERE Name = ISNULL(@name, name)
AND dob between ISNULL(@startdate, dob) AND ISNULL(@enddate, dob)
end
我编辑你的问题,以使大家多一点清楚。如果我误解了你的意思,请修复它。 – scsimon
注意:你不应该为存储过程使用'sp_'前缀。微软已经保留了这个前缀以供自己使用(参见*命名存储过程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你将来有可能冒着名字冲突的风险。 [这对你的存储过程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是简单地避免使用'sp_'并将其他内容用作前缀 - 或者根本没有前缀! –