Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server存储过程可选参数,如果为null,则包括all_Sql_Sql Server_Sql Server 2008_Stored Procedures_Sql Server 2008 R2 - Fatal编程技术网

SQL Server存储过程可选参数,如果为null,则包括all

SQL Server存储过程可选参数,如果为null,则包括all,sql,sql-server,sql-server-2008,stored-procedures,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Stored Procedures,Sql Server 2008 R2,我有一个存储过程: ALTER PROCEDURE [dbo].[GetCalendarEvents] (@StartDate datetime, @EndDate datetime, @Location varchar(250) = null) AS BEGIN SELECT * FROM Events WHERE EventDate >= @StartDate AND EventDate <= @EndDa

我有一个存储过程:

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,并且由于location参数为null,我希望从所有位置获得结果

知道如何解决这个问题吗?

alterprocedure[dbo].[GetCalendarEvents]
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
(@StartDate DATETIME, @EndDate日期时间, @位置VARCHAR(250)=空 ) 作为 开始 挑选* 从事件中 其中EventDate>=@StartDate 而EventDate=@StartDate 而EventDate=@StartDate
和EventDate则
WHERE
子句中的部分应为

AND (@Location IS NULL OR Location=@Location)
试试这个

 SELECT * 
    FROM Events 
    WHERE EventDate >= @StartDate 
      AND EventDate <= @EndDate 
      AND Location = Case When LEN(@Location) > 0 Then  @Location Else Location End
选择*
从事件中
其中EventDate>=@StartDate
事件日期0,然后@Location Else Location End

使用动态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
ALTER过程[dbo].[GetCalendarEvents]
(@StartDate datetime,
@EndDate日期时间,
@位置varchar(250)=空)
作为
开始
声明@SQL NVARCHAR(最大值);
声明@PARAMETER_Definition NVARCHAR(最大值);
声明@WHERE_零件NVARCHAR(最大值);
设置@PARAMETER_definition='@StartDate-DATETIME、@EndDate-DATETIME、@Location-VARCHAR(250)'
SET@SQL='SELECT*
从事件中
其中EventDate>=@StartDate

谢谢,我会在10分钟内接受你的回答。成功了。祝您周末愉快如果events表中的Location列可以包含null,则此操作将失败。来自@TT的建议。这样更好。
 SELECT * 
    FROM Events 
    WHERE EventDate >= @StartDate 
      AND EventDate <= @EndDate 
      AND Location = Case When LEN(@Location) > 0 Then  @Location Else Location End
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