作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有四个间隔:
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
,作为一种重载结构。
Hourly(@Date, @Hour)
CREATE FUNCTION [dbo].[Hourly]
(
@Date DATETIME,
@Hour INT
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Daily](@Date)
WHERE
DATEPART(HOUR, [LogTime]) = @Hour
)
Daily(@Date)
CREATE FUNCTION [dbo].[Daily]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Monthly](@Date)
WHERE
DATEPART(DAY, [OffsetTime]) = DATEPART(DAY, @Date)
)
Monthly(@Date)
CREATE FUNCTION [dbo].[Monthly]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Yearly](@Date)
WHERE
DATEPART(MONTH, [OffsetTime]) = DATEPART(MONTH, @Date)
)
Yearly(@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]
)
最佳答案
我可以建议有一个像下面这样的函数。
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' )
)
在这里您需要传递一个名为@Mode
的额外参数,这样您就可以在存储过程中写入一个查询。
现在您可以像下面这样从您的 SP 调用电话。
SELECT * FROM [dbo].[GetData](@Date, @Hour,'Hourly')
或
SELECT * FROM [dbo].[GetData](@Date, NULL,'Yearly')
关于sql-server - 如何在 SELECT 语句中有条件地执行 FROM 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54385003/
我是一名优秀的程序员,十分优秀!