【发布时间】:2019-01-27 04:10:44
【问题描述】:
我有四个间隔:
Hourly
Daily
Monthly
Yearly
这些对应于四个表值函数:
Hourly(@Date, @Hour)
Daily(@Date)
Monthly(@Date)
Yearly(@Date)
接下来,我有一个 SSRS 参数@Interval,其值等于上述四个区间之一。那么根据参数的值,我需要调用相应的函数。
我已经尝试过这些方面的东西,但它当然不会解析:
SELECT * FROM
CASE
WHEN @Interval = 'Hourly' THEN (SELECT * FROM dbo.Hourly(@Date, @Hour) AS Result)
WHEN @Interval = 'Daily' THEN (SELECT * FROM dbo.Daily(@Date) AS Result)
WHEN @Interval = 'Monthly' THEN (SELECT * FROM dbo.Monthly(@Date) AS Result)
WHEN @Interval = 'Yearly' THEN (SELECT * FROM dbo.Yearly(@Date) AS Result)
END
当我在 SSRS 数据集中使用它时,它必须是单行 SQL 语句。
我运气不好?我是否必须重新考虑我的架构,还是可以在一个声明中完成?
--编辑--
根据请求,我将包含函数的 TSQL 代码。每个都调用另一个,一直到Yearly,作为一种重载结构。
每小时(@Date,@Hour)
CREATE FUNCTION [dbo].[Hourly]
(
@Date DATETIME,
@Hour INT
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Daily](@Date)
WHERE
DATEPART(HOUR, [LogTime]) = @Hour
)
每日(@Date)
CREATE FUNCTION [dbo].[Daily]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Monthly](@Date)
WHERE
DATEPART(DAY, [OffsetTime]) = DATEPART(DAY, @Date)
)
每月(@Date)
CREATE FUNCTION [dbo].[Monthly]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Yearly](@Date)
WHERE
DATEPART(MONTH, [OffsetTime]) = DATEPART(MONTH, @Date)
)
每年(@Date)
CREATE FUNCTION [dbo].[Yearly]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT TOP 100 PERCENT * FROM [LogEntries]
WHERE DATEPART(YEAR, [OffsetTime]) = DATEPART(YEAR, @Date)
ORDER BY [OffsetTime]
)
【问题讨论】:
-
是否所有函数都返回相同形状的表格,例如列的编号顺序和类型?
-
也显示功能,所有功能也可以更改为单个功能
-
@stickybit ~ 是的,这是一种“重载”类型的设计,每个较低的函数都会调用它上面的函数,直到我们到达
Yearly。你有什么想法? -
@PSK ~ 我添加了这些功能。我对您将它们结合起来的想法非常感兴趣。
标签: sql-server tsql reporting-services