如何在SQL存储过程中使1参数可选

时间:2014-06-03 21:18:37

标签: sql sql-server tsql stored-procedures

我有以下存储过程,最终将内置到.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”行?

如果您需要任何其他信息,请与我们联系。

3 个答案:

答案 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