Если регистр в хранимой процедуре - PullRequest
2 голосов
/ 05 марта 2012

У меня есть хранимая процедура:

 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

Теперь в этой процедуре, если я передам @ DepartmentId = 24, тогда я получу результаты только для отдела 24, однако я хочу, чтобы он отображал результаты с @ DepartmentId = 24 и для департамента ID = ноль

Как мне изменить процедуру, чтобы получить это?

Ответы [ 2 ]

4 голосов
/ 05 марта 2012

Попробуйте это как ваше предложение 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]

РЕДАКТИРОВАТЬ: Вы также можете попробовать:

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]
1 голос
/ 05 марта 2012
WHERE COALESCE(A.DepartmentId, 'x') = COALESCE(@DepartmentId, A.DepartmentId, 'x')

при условии, что 'x' является допустимым значением типа DepartmentId, но не существует в домене.

Однако учтите, что вы можете повысить производительность, используя серию блоков IF.

...