【问题标题】:Best way of creating dynamic conditions in sql functions在 sql 函数中创建动态条件的最佳方法
【发布时间】:2017-01-02 08:24:01
【问题描述】:

我对一些“生成的代码过多”或不是最优雅的编码方式问题有一个挑战:

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 语句不起作用,因为我不能执行 Location equals 或 IS NOT NULL 语句。

【问题讨论】:

    标签: sql-server function convention


    【解决方案1】:

    这样的事情呢?

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

    【讨论】:

      【解决方案2】:

      试试这个,

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多