2016-12-15 123 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_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](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 
相關問題