1

我有這個存儲過程:SQL Server存儲過程可選參數,包括所有的如果空

ALTER PROCEDURE [dbo].[GetCalendarEvents] 
    (@StartDate datetime, 
    @EndDate datetime, 
    @Location varchar(250) = null) 
AS 
BEGIN 
    SELECT * 
    FROM Events 
    WHERE EventDate >= @StartDate 
     AND EventDate <= @EndDate 
     AND (Location IS NULL OR Location = @Location) 
END 

現在,我的位置參數,我想要做的是,如果該參數不爲null,則包括參數在where子句中。如果參數爲空,我想完全忽略那個參數,並且只通過開始和結束日期得到結果。

因爲當我這樣做,例如:

EXEC GetCalendarEvents '02/02/2014', '10/10/2015', null 

我沒有得到任何結果,因爲有其不空,因爲位置參數爲空,我想其他位置來自所有地點的結果。

任何想法如何解決這個問題?

感謝,Laziale

回答

2
ALTER PROCEDURE [dbo].[GetCalendarEvents] 
(@StartDate DATETIME, 
    @EndDate DATETIME, 
    @Location VARCHAR(250) = NULL 
) 
AS 
BEGIN 
    SELECT * 
    FROM events 
    WHERE EventDate >= @StartDate 
      AND EventDate <= @EndDate 
      AND Location = ISNULL(@Location, Location) 
END 

如果NULL列是一個可能性,那麼這會工作。

ALTER PROCEDURE [dbo].[GetCalendarEvents] 
(@StartDate DATETIME, 
    @EndDate DATETIME, 
    @Location VARCHAR(250) = NULL 
) 
AS 
BEGIN 
    IF (@loc IS NULL) 
     BEGIN 
      SELECT * 
      FROM events 
      WHERE EventDate >= @StartDate 
        AND EventDate <= @EndDate 
     END 
    ELSE 
     BEGIN 
      SELECT * 
      FROM events 
      WHERE EventDate >= @StartDate 
        AND EventDate <= @EndDate 
        AND Location = @Location 
     END 
END 

由於可能的性能問題,應該合理地避免使用'OR'子句。

+0

謝謝,我會在10分鐘內接受您的回答。那樣做了。週末愉快 – Laziale 2015-04-03 15:39:46

+0

如果事件表中的位置列可以包含空值,這將失敗。來自@TT的建議。更好。 – 2015-04-03 17:35:52

0

WHERE子句中的一部分,那麼應該閱讀

AND (@Location IS NULL OR [email protected]) 
0

試試這個

SELECT * 
    FROM Events 
    WHERE EventDate >= @StartDate 
     AND EventDate <= @EndDate 
     AND Location = Case When LEN(@Location) > 0 Then @Location Else Location End 
0

它可以與動態SQL查詢中輕鬆地完成。

ALTER PROCEDURE [dbo].[GetCalendarEvents] 
(@StartDate datetime, 
@EndDate datetime, 
@Location varchar(250) = null) 
AS 
BEGIN 
    DECLARE @SQL NVARCHAR(MAX); 
    DECLARE @PARAMETER_DEFIINITION NVARCHAR(MAX); 
    DECLARE @WHERE_PART NVARCHAR(MAX); 

    SET @PARAMETER_DEFIINITION =' @StartDate DATETIME, @EndDate DATETIME, @Location VARCHAR(250) ' 

    SET @SQL ='SELECT * 
       FROM Events 
       WHERE EventDate >= @StartDate 
       AND EventDate <= @EndDate ' 

    IF @Location IS NOT NULL 
    BEGIN 
     SET @WHERE_PART = ' AND Location = @Location ' 
    END  

    SET @SQL = @SQL + @WHERE_PART 
    EXEC SP_EXECUTESQL @SQL, @PARAMETER_DEFIINITION, @StartDate, @EndDate, @Location 
END 

將根據參數動態創建查詢。在這裏,如果@location爲null,那麼它將不會添加到where部分。

如果您希望編寫動態查詢更多請參閱這篇文章。 http://codingpulse.blogspot.com/2015/02/dynamic-sql-in-stored-procedure-part-1.html

相關問題