如何在SELECT语句中有条件地执行FROM子句?

时间:2019-01-27 04:10:45

标签: sql-server tsql reporting-services

我有四个间隔:

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]
)

1 个答案:

答案 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')