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