0

SQL に次の SP があります。

ALTER PROCEDURE [dbo].[search_employee_special]  
 (  
 @employeruid uniqueidentifier,
 @groupuid uniqueidentifier,
 @includedependants bit = 0
 )  
AS

DECLARE @emptyuid uniqueidentifier
SET @emptyuid = CAST(CAST(0 AS BINARY) AS UNIQUEIDENTIFIER)

SELECT 
    emp.id,
    emp.name
FROM employee emp
WHERE emp.isactive = 1
  AND employeruid = @employeruid 
  AND (@groupuid = @emptyuid  OR emp.gropuid = @groupuid)

@groupuid が空の GUID の場合、これはフィルターでうまく機能します。それ以外の場合は、groupuid でフィルター処理します...

ここで、他のパラメーターを組み合わせる必要があるため、必要なものはもう少し複雑です。

 ALTER PROCEDURE [dbo].[search_employee_special]  
     (  
     @employeruid uniqueidentifier,
     @groupuid uniqueidentifier,
     @includedependants bit = 0
     )  
    AS

        DECLARE @emptyuid uniqueidentifier
        SET @emptyuid = CAST(CAST(0 AS BINARY) AS UNIQUEIDENTIFIER)

        SELECT 
            emp.id,
            emp.name
        FROM employee emp
        WHERE emp.isactive = 1
          AND employeruid = @employeruid 
        --AND (@groupuid = @emptyuid  OR emp.gropuid = @groupuid)
          AND (
               (@includedependants = 0 AND 
                  (@groupuid  = @emptyuid 
                  OR emp.groupuid = @groupuid))    
              OR emp.specialgroupuid = @groupuid)

これは機能しません...必要なのは、@includedependants = 1の場合はemp.specialgroupuidをフィルタリングし、それ以外の場合はemp.groupuidをフィルタリングすることです。

それを解決する方法の手がかりはありますか?私はその何かが単純だと確信しています:)

事前に助けに感謝します。

4

2 に答える 2

3
AND (
     (
      @includedependants = 0 AND 
      (@groupuid  = @emptyuid OR emp.groupuid = @groupuid)
     )    
     OR emp.specialgroupuid = @groupuid
    )

OR値に関係なく、パーツは常に実行されますが@includedependants、これはあなたが望むものではないと思います。あなたが望むのはもっと似たものです。

AND (
     (
      @includedependants = 0 AND 
      (@groupuid  = @emptyuid OR emp.groupuid = @groupuid)
     )    
     OR 
     (
      @includedependants = 1 AND 
      emp.specialgroupuid = @groupuid
     )
    )
于 2013-06-28T22:58:56.020 に答える
1

ケースを使用します。残念ながら、必要な構文はかなり醜いものになっています。

AND 1 = case when @includedependants = 1 then 
        case when emp.specialgroupuid = @groupuid then 1 else 0 end
    else 
        case when @groupuid  = @emptyuid OR emp.groupuid = @groupuid then 1 else 0 end 
    end
于 2013-06-28T23:00:16.730 に答える