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