联盟或使用流控制逻辑,以确定汇报对表
-
22-08-2019 - |
题
我与第三pary应用在哪里可以不改变表工作。我们建立定制匹配“月”表有一个额外的日期时间列“AsOfDate”我们在一个月和国旗同月的最后一天的日期这些数据的最终转储数据。
我希望能够创建单个存储过程(应用被设计成需要的图或存储的过程作为所有报告。源极),并使用一个参数,其将或者使用当前数据表(参数可以是NULL或=今天的日期)或每月日期的最终用途月底表和过滤。这样一来,我有一个报告,其中用户既可以使用电流或数据从一个特定的月份结束的时期。
你喜欢哪种(为什么)很抱歉,这是不完全编码
<强>溶液#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
解决方案
你怎么有事情成立了,第二种方法可能会更快。如果你使用一个分区视图,那么你可以设置约束,优化后会知道要忽略在选择表的一个或多个这样的方式,你会得到相同的性能。这也将让你把所有在一个声明你的逻辑,而不是保持同步两个语句。这可能是也可能不是你的问题基于SELECT语句的复杂程度。
有一点要记住,虽然,是,如果你使用第二种方法时,一定要标记您的存储过程作为WITH(RECOMPILE)(我不记得,如果括号是需要与否 - 检查语法)。这样,该优化器将根据IF语句的哪个分支创建一个新的查询计划需要被执行。
其他提示
我更喜欢不愈合溶液。从单个表中选择永远比做工会和工会选择单个表的数据更快。
不隶属于 StackOverflow