2017-01-02 11 views
0

У меня есть проблемы в отношении некоторой «слишком много коды производится» или не самый элегантное кодирование способа вопроса:Лучшего способ создания динамических условий в SQL функций

ALTER FUNCTION [dbo].fn_Function 
    (@Location NVARCHAR(30) ='ALL') 
RETURNS @ReportTable TABLE(DateOfProviValidity date, 
          DateOfFixumValidity date, 
          UserID NVARCHAR(50) 
         ) 
AS 
BEGIN 
    DECLARE @CurrentMonth DATE 

    SET @CurrentMonth = dbo.fn_getFirstOfMonth(getdate()) 

    IF @Location IS NOT NULL AND @Location <> 'ALL' 
     INSERT INTO @ReportTable 
      SELECT * 
      FROM dbo.fn_getFinalPData(@CurrentMonth) 
      WHERE 1 AND Location = @Location 
    ELSE 
     INSERT INTO @ReportTable 
      SELECT * 
      FROM dbo.fn_getFinalPData(@CurrentMonth) 
      WHERE 1 AND Location IS NOT NULL 

    RETURN 
END 

Есть ли возможность избавиться от первоначального IF @Location и добавить его ближе к пункту Where?

Моя проблема заключается в том, что оператор case не работает, так как я не могу выполнить действие «Место равно» или «НЕ НУЛЛ».

ответ

0

Попробуйте это,

SELECT * 
FROM dbo.fn_getFinalPData(@CurrentMonth) 
WHERE 1 
    AND Location = ISNULL(NULLIF(@Location,'ALL'),Location) 
1

Как насчет этого?

INSERT INTO @ReportTable 
SELECT * 
FROM dbo.fn_getFinalPData(@CurrentMonth) 
WHERE ISNULL(@Location, 'ALL') <> 'ALL' 
OR Location = @Location