我有以下存储过程,最终将内置到.NET应用程序中。非常基本......用户将根据选择选择参数并接收两个数据列表:
CREATE PROCEDURE [dbo].[sp_GetList]
@Chain varchar(255),
@EffectiveDate datetime,
@ClientName varchar(255),
@Indicator varchar(255)
AS
SELECT *
FROM dbo.Archive
WHERE XX_Effective_Date = @EffectiveDate
AND XX_Chain = @Chain
AND XX_Client_Name = @ClientName
AND XX_Indicator = @Indicator
SELECT *
FROM dbo.Archive2
WHERE XX_Chain = @Chain
AND XX_Effective_Date = @EffectiveDate
GO
如果第一个SELECT语句总是需要所有四个参数,这将正常工作,但情况并非如此。在某些情况下,为了获得正确的结果,用户必须选择除@Indicator之外的所有参数。当我按原样执行此存储过程时,它会失败,因为它需要@Indicator的参数。当@Indicator参数留空时,如何使它忽略“AND XX_Indicator = @Indicator”行?
如果您需要任何其他信息,请与我们联系。
答案 0 :(得分:2)
@Indicator varchar(255) = ""
会给它一个默认值
AND (XX_Indicator = @Indicator or @Indicator = '')
只会检查它是否为空
答案 1 :(得分:2)
声明参数I.E.的默认值。 @Chain varchar(255) = NULL
以便在您的查询中,您可以将谓词更改为XX_Chain = ISNULL(@Chain,XX_Chain)
两者合并都会使得给定的参数不是必需的,也不会限制查询结果。
答案 2 :(得分:0)
将省略的@Indicator
变量声明为= NULL
,并在选择stetement中使用CASE
。
对于省略的参数指标,以下操作将转换为Constant=Constant
,并且将花费大约。除了通常的查询之外什么都没有。
CREATE PROCEDURE [dbo].[sp_GetList]
@Chain varchar(255),
@EffectiveDate datetime,
@ClientName varchar(255),
@Indicator varchar(255) = NULL
AS
SELECT *
FROM dbo.Archive
WHERE XX_Effective_Date = @EffectiveDate
AND XX_Chain = @Chain
AND XX_Client_Name = @ClientName
AND @Indicator =
case when @Indicator is null then @Indicator else XX_Indicator end;
SELECT *
FROM dbo.Archive2
WHERE XX_Chain = @Chain
AND XX_Effective_Date = @EffectiveDate