代码之家  ›  专栏  ›  技术社区  ›  JeffO

联合或使用流控制逻辑确定要报告的表

  •  0
  • JeffO  · 技术社区  · 16 年前

    我正在使用第三个Pary应用程序,我无法更改表。我们用附加的日期时间列“asofdate”构建了自定义匹配的“monthly”表,在该列中,我们在月末转储数据,并将这些数据标记为该月最后一天的日期。

    我希望能够创建一个单独的存储过程(应用程序设计为需要一个视图或存储过程作为所有报告的源),并使用一个参数,该参数将使用当前数据表(参数可能为空或=今天的日期),或者使用月末表并在月末日期前进行筛选。这样,我就有了一个报表,用户可以在其中使用当前值或特定月末期间的数据。

    你更喜欢哪一种(为什么)对不起,这个没有完全编码

    解决方案1联合查询

    Create Proc Balance_Report (@AsOfDate)
    AS
    
    Select Column1
    From
        (Select GetDate() as AsOfDate
           , Column1 
         From Current.Balance
        Union 
        Select AsOfDate
           , Column1 From MonthEnd.Balance
        ) AS All_Balances
    Where All_Balances.AsOfDate = @AsOfDate
    

    解决方案2使用if语句选择表

    Create Proc Balance_Report (@AsOfDate)
    AS
    
    If @AsOfDate IS NULL or @AsOfDate = GetDate()
       Select GetDate() as AsOfDate
           , Column1 
         From Current.Balance
    Else
        Select AsOfDate
           , Column1 From MonthEnd.Balance
        Where AsOfDate = @AsOfDate
    

    同样,这不是完全编码的,有点不可知数据库(但它是SQL Server 2005)。

    编辑:使用单独的存储过程更改解决方案2

    Create Proc Balance_Report (@AsOfDate)
    AS
    
    If @AsOfDate IS NULL or @AsOfDate = GetDate()
       Exec Current_Balance_Date -- no param necessary
    Else
        exec MonthEnd_Balance_Date @AsOfDate
    
    2 回复  |  直到 11 年前
        1
  •  1
  •   Tom H zenazn    16 年前

    如何设置,第二种方法可能会更快。如果要使用分区视图,那么可以设置约束,使优化后的可以忽略select中的一个或多个表,从而获得相同的性能。这还可以让您将所有逻辑保存在一个语句中,而不必使两个语句保持同步。根据select语句的复杂程度,这对您来说可能是一个问题,也可能不是问题。

    不过要记住的一点是,如果使用第二个方法,请确保将存储过程标记为with(recompile)(我不记得是否需要括号-请检查语法)。这样优化器将根据需要执行的if语句分支创建一个新的查询计划。

        2
  •  1
  •   tvanfosson    16 年前

    我更喜欢非工会解决方案。从单个表中选择总是比执行联合和从联合中选择单个表的数据更快。