我是否可以将存储过程合并到常规查询中,或者我是否认为它是错误的?(SQL Server 2016)

我是否可以将存储过程合并到常规查询中,或者我是否认为它是错误的?(SQL Server 2016),sql,sql-server,stored-procedures,reporting-services,Sql,Sql Server,Stored Procedures,Reporting Services,这可能是一个经典的SO场景,其中的问题没有解决我试图实现的目标,因此我将仅解释我的情况 我已经创建了大量SSRS报告。其中许多共享多个公共字段。这些字段的基本定义经常发生变化,我必须对每个报告进行必要的修改,这非常耗时,并且可能会导致错误,导致报告出现分歧 我创建了一个过程,它以@startdate和@enddate作为参数,并根据我们当前的定义返回4个公共字段(提供的呼叫、接听的呼叫、20秒内接听、挂断),当我自己执行它时,效果非常好。我想要的是将该过程作为更大的SELECT查询的一部分,该查

这可能是一个经典的SO场景,其中的问题没有解决我试图实现的目标,因此我将仅解释我的情况

我已经创建了大量SSRS报告。其中许多共享多个公共字段。这些字段的基本定义经常发生变化,我必须对每个报告进行必要的修改,这非常耗时,并且可能会导致错误,导致报告出现分歧

我创建了一个过程,它以@startdate和@enddate作为参数,并根据我们当前的定义返回4个公共字段(提供的呼叫、接听的呼叫、20秒内接听、挂断),当我自己执行它时,效果非常好。我想要的是将该过程作为更大的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

即使您更改了SP定义,您的报告也不会显示新添加的列,直到您更改了报告设计,您也需要更改/更新报告,以显示新的列。或创建具有动态列的报告。只有到那时,如果你改变了程序,报告也会改变,但是要在SSRS报告中使用动态列,还有一种更灵活的处理方法。使用SQL Server表存储报表列名等。我希望SP中的列保持不变,但更改它们的定义方式。例如,挂断的定义是一个大案例语句,对于不同的帐户有不同的方面。如果呼叫者在5秒钟后挂断,则一些仅为“计数”。当新帐户联机或旧帐户更改时,“挂断”的定义将更改。因此,您的意思是,列的输出是相同的(名称、编号和数据类型),这是行更改的唯一逻辑?是的,请参阅我上面编辑的注释以获得澄清(希望如此)。我不能100%确定我是否理解您的问题,但您可能希望使用视图来组合公共字段,而不是使用存储过程。视图可以像表一样直接集成到查询中,而对于存储过程,您必须执行其他操作。
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]