2016-12-15 3 views
1

У меня есть хранимая процедура, в которой мне нужно реализовать условие 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 
+0

отредактировать свой вопрос, чтобы сделать его немного более понятным для всех. Если я неверно истолковал ваш смысл, исправьте это. – scsimon

+0

Примечание: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (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_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

ответ

0

Вы может сделать это следующим образом:

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.

1

Я думаю, 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 
Смежные вопросы