我有四个间隔:
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
,都是一种过载结构。
每小时(@日期,@小时)
CREATE FUNCTION [dbo].[Hourly]
(
@Date DATETIME,
@Hour INT
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Daily](@Date)
WHERE
DATEPART(HOUR, [LogTime]) = @Hour
)
每日(@日期)
CREATE FUNCTION [dbo].[Daily]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Monthly](@Date)
WHERE
DATEPART(DAY, [OffsetTime]) = DATEPART(DAY, @Date)
)
每月(@日期)
CREATE FUNCTION [dbo].[Monthly]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Yearly](@Date)
WHERE
DATEPART(MONTH, [OffsetTime]) = DATEPART(MONTH, @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]
)
答案 0 :(得分:1)
我建议您使用一个如下功能。
ContactAttempt
这里您需要传递一个名为CREATE FUNCTION [dbo].[GetData]
(
@Date DATETIME,
@Hour INT,
@Mode VARCHAR(10)
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [LogEntries]
WHERE
(DATEPART(YEAR, [OffsetTime]) = DATEPART(YEAR, @Date) AND @Mode='Yearly')
OR
(DATEPART(MONTH, [OffsetTime]) = DATEPART(MONTH, @Date) AND @Mode='Monthly')
OR
( DATEPART(DAY, [OffsetTime]) = DATEPART(DAY, @Date) AND @Mode='Daily')
OR
( DATEPART(HOUR, [LogTime]) = @Hour AND @Mode='Hourly' )
)
的附加参数,这样您就可以在存储过程中编写一个查询。
现在,您可以像下面这样从SP拨打电话。
@Mode
OR
SELECT * FROM [dbo].[GetData](@Date, @Hour,'Hourly')