SQL 服务器存储过程可选参数,如果为空则包括所有
SQL Server stored procedure optional parameters, include all if null
我有这个存储过程:
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
现在,我有了 location 参数,我想做的是如果参数不为空,则将参数包含在 where 子句中。如果参数为空,我想完全忽略 where 参数,只根据开始和结束日期获取结果。
因为当我这样做时:
EXEC GetCalendarEvents '02/02/2014', '10/10/2015', null
我没有得到任何结果,因为还有其他位置不为空,并且由于位置参数为空,我想从所有位置获得结果。
知道如何解决这个问题吗?
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' 子句。
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
可以通过动态 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 部分。
If you want more on writing dynamic queries please refer this article. http://codingpulse.blogspot.com/2015/02/dynamic-sql-in-stored-procedure-part-1.html
我有这个存储过程:
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
现在,我有了 location 参数,我想做的是如果参数不为空,则将参数包含在 where 子句中。如果参数为空,我想完全忽略 where 参数,只根据开始和结束日期获取结果。
因为当我这样做时:
EXEC GetCalendarEvents '02/02/2014', '10/10/2015', null
我没有得到任何结果,因为还有其他位置不为空,并且由于位置参数为空,我想从所有位置获得结果。
知道如何解决这个问题吗?
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' 子句。
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
可以通过动态 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 部分。
If you want more on writing dynamic queries please refer this article. http://codingpulse.blogspot.com/2015/02/dynamic-sql-in-stored-procedure-part-1.html