是否可以将存储过程合并到常规查询中,还是考虑错了?(SQL Server 2016)



这可能是一个经典的SO场景,问题没有解决我想要实现的目标,所以我只会解释我的情况。

我创建了大量 SSRS 报告。其中许多共享许多共同字段。这些字段的基本定义会定期更改,我必须检查每个报告进行必要的更改,这很耗时,并且有可能出现错误,使报告发散。

我创建了一个过程,该过程将 @startdate 和 @enddate 作为参数,并根据我们当前的定义(提供的呼叫、应答的呼叫、20 秒内应答的呼叫、响铃)返回 4 个公共字段,当我自己执行它时效果很好。我想要的是将该过程作为包含非公共字段的较大 SELECT 查询的一部分。类似的东西

SELECT
,[Date]
,[Total seconds]
,(procedure fields)
,...
from [table]
where [date] >= '2017-01-01'
group by [date]

在我看来,这意味着当定义发生变化时,我只需要更改一次程序,每个报告都会更新。这可能吗?还是我使用了错误的工具来实现我想要实现的目标?如果是这样,我应该使用什么?

好吧,我认为内联表值函数更适合您的要求。

您将能够使用内联表值函数向下推送谓词,也可以在 select 语句中选择它。

像.....

CREATE FUNCTION dbo.ILTVF_CommonColumns ( 
@startdate  DATETIME 
,   @enddate    DATETIME
)
RETURNS TABLE
AS
RETURN
SELECT    Column1   
, Column2
, Column3
, Column4
FROM    dbo.TableName             -- Change logic here whenever need to
WHERE   DateColumn >= @startdate
AND     DateColumn <= @enddate;
GO

样品选择

SELECT
[Date]
,   [Total seconds]
,   fn.*
from [table] t
CROSS APPLY dbo.ILTVF_CommonColumns (@StartDate , @EndDate) fn 
^           ^
|___________| 
Or these could be fields from your [Table]
where t.[date] >= '2017-01-01'
group by [date]

最新更新