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