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

相关问题