2012-03-05 7 views
2

ストアドプロシージャ内の場合:私は、しかし、私はそれが@DepartmentIdで結果を表示したい、@ DepartmentIdの= 24が、その後、私は唯一の部門24の結果を得る渡す場合、この手順で今もし私が手続き保存されている

ALTER PROCEDURE [dbo].[proc_GetApplicationByCostCentreId] 
( 
    @CostCentreId TINYINT, 
    @DepartmentId INT = NULL, 
    @IsActive BIT = NULL 
) 
AS 

BEGIN 
    SELECT 
     A.Id, A.Name, A.URL, 
     A.CostCentreId, C.CostCentre, 
     A.DepartmentId, D.DepartmentName, 
     A.ApplicationOwnerTypeId, AOT.Type, 
     A.SupportContact, 
     A.IsActive, A.AddedOn, A.AddedBy, A.ModifiedOn, A.ModifiedBy 
    FROM 
     dbo.Applications A 
     INNER JOIN dbo.Central_CostCentre_Main C ON A.CostCentreId = C.CostCentreId 
     LEFT OUTER JOIN dbo.Central_Department_Main D ON A.DepartmentId = D.DepartmentID 
     INNER JOIN dbo.ApplicationOwnerType AOT ON A.ApplicationOwnerTypeId = AOT.Id 
    WHERE  
     A.CostCentreId = @CostCentreId 
    AND CASE WHEN @DepartmentId IS NULL THEN 1 ELSE CASE WHEN A.DepartmentId = @DepartmentId THEN 1 ELSE 0 END END = 1 
    AND CASE WHEN @IsActive IS NULL THEN 1 ELSE CASE WHEN A.IsActive = @IsActive THEN 1 ELSE 0 END END = 1 
    ORDER BY [Name] 
END 

= 24、departmentsId = null

これを行うにはどのように手順を変更する必要がありますか?

答えて

4

あなたのwhere句としてこれを試してみてください:

WHERE  
    A.CostCentreId = @CostCentreId AND 
    (A.DepartmentId = @DepartmentId OR A.DepartmentId IS NULL 
     OR @DepartmentId IS NULL) /* also return row if the arg is null */ AND 
    A.IsActive = ISNULL(@IsActive, 1) 
ORDER BY [Name] 

EDIT:あなたはおそらくも試みることができる:'x'を想定し

WHERE  
    A.CostCentreId = @CostCentreId AND 
    (ISNULL(A.DepartmentId, @DepartmentId) = @DepartmentId 
     OR @DepartmentId IS NULL) /* also return row if the arg is null */ AND 
    A.IsActive = ISNULL(@IsActive, 1) 
ORDER BY [Name] 
+0

ありがとうございます、これは部分的に動作します。 '@DepartmentId'がnullで、 '@CostCentreId'のみが指定されている場合は、ゼロの行が得られます。要するに、@DepartmentIdが提供されている場合にのみ動作します。私はどちらかの方法をしたい.. – user1181942

+1

私の編集された答えを参照してください。それはヌルパラメータを処理する必要があります。 – tobias86

+0

ありがとう...これは完璧です.. – user1181942

1
WHERE COALESCE(A.DepartmentId, 'x') = COALESCE(@DepartmentId, A.DepartmentId, 'x') 

はタイプDepartmentIdの有効な値であるが、しませんドメイン内に存在する

ただし、一連のIFブロックを使用すると、パフォーマンスが向上する可能性があることを考慮してください。

関連する問題