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

Sql server 如何在SELECT语句中有条件地执行FROM子句?,sql-server,tsql,reporting-services,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

我有四次间隔:

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代码。每一个调用另一个,一直到
每年
,都是一种重载结构

每小时(@日期,@小时)

每日(@日期)

每月(@日期)

每年(@日期)


我可以建议使用如下的单个函数

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

)
SELECT * FROM [dbo].[GetData](@Date, @Hour,'Hourly')
这里您需要传递一个名为
@Mode
的额外参数,这样您就可以在存储过程中编写一个查询

现在,您可以从SP拨打电话,如下所示

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

)
SELECT * FROM [dbo].[GetData](@Date, @Hour,'Hourly')


是否所有函数都返回相同形状的表,如列的编号顺序和类型?同时显示函数,所有函数都可以更改为单个函数also@stickybit~z~是的,这是一种“重载”类型的设计,每个较低的函数都会调用它上面的函数,直到我们到达
年度
。你有什么想法?@PSK~我添加了函数。我对你关于合并它们的想法很感兴趣。实际上,我只是从一张表中选择。最后,在
Yearly()
函数中
Hourly()
调用
Daily()
Daily()
调用
Monthly()
Monthly()
调用
Yearly()
。这是否改变了您建议的功能?对不起,我误解了功能,我已更新了答案,请检查。恐怕这不起作用。首先,
AS模式
语法没有解析,所以我不得不删除它。此外,该功能必须仅选择指定日期(如2018年10月15日)内的行。
关键字允许超出该日期的行进入结果集中。现在,where子句对于每种类型都明显不同,您可以针对这些人来解决数据问题。我觉得,通过嵌套函数,问题过于复杂了。您可以使用简单的where子句实现这一点,其中每种类型的请求都用“OR”子句分隔。
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' )

)
SELECT * FROM [dbo].[GetData](@Date, @Hour,'Hourly')
SELECT * FROM  [dbo].[GetData](@Date, NULL,'Yearly')