【问题标题】:Stored procedure for search operation搜索操作的存储过程
【发布时间】:2012-02-20 11:36:30
【问题描述】:

我在 SQL Server 2005 中有一个存储过程,用于根据从 UI 传递的参数检索值。

这基本上是对许多表的JOIN 名称的搜索操作。我的问题是,当用户不提供中间名时,我的程序无法访问该值。

    P.FirstName = Coalesce( @FirstName,P.FirstName) AND 
    P.MiddleName = Coalesce(@MiddleName,P.MiddleName)  AND 
    P.LastName = Coalesce( @LastName,P.LastName) AND
    (
         P.FirstName = Coalesce(@anyName,P.FirstName)  OR
   P.MiddleName = Coalesce(@anyName,P.MiddleName)  OR
   P.LastName = Coalesce(@anyName,P.LastName) 
     )

我无法删除中间名,因为我在上述所有列上都提供了过滤选项。

【问题讨论】:

标签: sql sql-server sql-server-2005


【解决方案1】:
where (MiddleName = Coalesce(@MiddleName ,MiddleName ) or MiddleName is null)

不要忘记在您引用 MiddleName 的两个位置都这样做

【讨论】:

    【解决方案2】:

    改成这样:

    (P.MiddleName = @MiddleName or P.MiddleName is null or @MiddleName is null)
    

    这是完整的例子:

    (P.FirstName = @FirstName or P.FirstName is null or @FirstName is null) AND
    (P.MiddleName = @MiddleName or P.MiddleName is null or @MiddleName is null) AND      
    (P.LastName = @LastName or P.LastName is null or @LastName is null) AND     
    (  @AnyName is null or
       P.FirstName =  @AnyName or
       P.MiddleName = @AnyName or       
       P.LastName   = @AnyName ) 
    

    【讨论】:

    • 按照您的建议制作后,我的过滤器选项无法正常工作。
    【解决方案3】:

    试试这样的

    CASE WHEN @FirstName IS NULL THEN CASE WHEN P.FirstName is NULL THEN 1 ELSE 0 END
        ELSE CASE WHEN P.FirstName = Coalesce( @FirstName,P.FirstName) THEN 1 ELSE 0 END
            END = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2020-11-05
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多