【问题标题】:Conditional stored procedure with bool values具有布尔值的条件存储过程
【发布时间】:2013-02-07 21:59:47
【问题描述】:

我正在尝试组装一个存储过程以返回一组结果。

在我的页面上,我有三个复选框和一个搜索框。

然后在存储过程中,我有这个:

CREATE Procedure [dbo].[sp_Search]
   @Bool1 bit = NULL, 
   @Bool2 bit = NULL,
   @Bool3 bit = NULL,
   @SearchTerm nvarchar(30)
As
Begin
   Select 
        [CompanyID],
        [CompanyName],
        [Label],
        [Bool1],[Bool2],[Bool3]     
    From [Contract Companies]
    WHERE (CompanyName LIKE @SearchTerm OR [Label] LIKE @SearchTerm) AND
    if(@Bool1 IS NOT NULL)
    [Bool1] = 'True'
    end 

if(@Bool2 IS NOT NULL)
 AND    [Bool2] = 'True'
    end 

if(@Bool3 IS NOT NULL)
AND [Bool3] = 'True'
    end 

类似的东西,这三个布尔值并非一直为真,就在它们的复选框将被选中时。

我怎样才能做到这一点?

提前致谢,Laziale

【问题讨论】:

  • 为什么不让这些参数不可为空,只传递一个值呢?否则你可能会使用CASE statement

标签: sql stored-procedures sql-server-2012


【解决方案1】:

你可以试试这样的:

create procedure [dbo].[sp_Search]
   @Bool1 bit = null, 
   @Bool2 bit = null,
   @Bool3 bit = null,
   @SearchTerm nvarchar(30)
as
begin
   select 
        CompanyID,
        CompanyName,
        Label,
        Bool1,
        Bool2,
        Bool3    
    from Contract Companies
    where (CompanyName like @SearchTerm or Label like @SearchTerm)
        and (Bool1 = @Bool1 or @Bool1 is null)
        and (Bool2 = @Bool2 or @Bool2 is null)
        and (Bool3 = @Bool3 or @Bool3 is null)
end

如果存在,这将获得每个布尔值的匹配记录,否则将获得所有记录。

注意到这个may not be the best performing method 动态检查值,但它们在这里是位(often not indexed),我认为它非常适合。那篇文章中讨论了替代方案。

【讨论】:

    【解决方案2】:

    带有CASE 表达式的选项

    CREATE Procedure [dbo].[sp_Search]
       @Bool1 bit = NULL, 
       @Bool2 bit = NULL,
       @Bool3 bit = NULL,
       @SearchTerm nvarchar(30)
    As
    Begin
       Select 
            [CompanyID],
            [CompanyName],
            [Label],
            [Bool1],[Bool2],[Bool3]     
        From [Contract Companies]
        WHERE (CompanyName LIKE @SearchTerm OR [Label] LIKE @SearchTerm) AND
              [Bool1] = CASE WHEN @Bool1 IS NOT NULL THEN 'True' ELSE [Bool1] END AND
              [Bool2] = CASE WHEN @Bool2 IS NOT NULL THEN 'True' ELSE [Bool2] END AND
              [Bool3] = CASE WHEN @Bool3 IS NOT NULL THEN 'True' ELSE [Bool3] END 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多