使用存储过程将两个数据源合并为一个 SSRS 报表中的数据源

Combine two data sources into one data source inside SSRS report using a stored procedure

提问人:Sanjay Chaudhary 提问时间:11/4/2023 最后编辑:marc_sSanjay Chaudhary 更新时间:11/5/2023 访问量:46

问:

我正在尝试构建将从两个不同服务器获取数据的 SSRS 报告。

我已经创建了一个在 Management Studio 中运行时工作正常的存储过程,但是当我从 SSRS 报表生成器调用它时,该存储过程不起作用。

这是我的存储过程中的 SQL 查询:

Select 
    serv1.PatientName, serv1.DoctorName,
    serv2.HospitalName, serv2.DoctorDegree 
from 
    server1.database1.tblPatient serv1
inner join 
    server2.database2.tbldoctor serv2 on serv2.PatientID = serv1.PatientID
where 
    serv2.PatientID = 2

请考虑上面的查询只是示例。由于存储过程工作正常。我还创建了两个连接完全正常的数据源。

主要问题是如何在 SSRS 报表中将两个数据源连接到单个数据源?

SQL-Server Reporting-Services 数据集 SSRS-2012 SQLDataSource

评论

0赞 Chris Schaller 11/4/2023
数据库是本地还是托管在同一基础结构中?
0赞 Sanjay Chaudhary 11/4/2023
是的,他们确实@ChrisSchaller
0赞 Chris Schaller 11/5/2023
此示例不起作用,跨服务器查询有 4 个部分来完全限定表:...当您从 SSMS 运行它时,您确定这有效吗?Server.Database.Schema.Table
0赞 Sanjay Chaudhary 11/6/2023
是的,它确实如此,并且像您所说的那样,关于连接到另一台服务器的过程,这就是我所做的,但忘记在上面的查询示例中提及。再次感谢你@ChrisSchaller

答:

0赞 Chris Schaller 11/4/2023 #1

这确实需要在 SSRS 之外进行管理。在 SSRS 中将多个数据源合并到单个表中的任何技术都不是很好或推荐的。因此,如果您可以直接从一台服务器查询到另一台服务器,那么这是最佳选择。若要将数据放入 SSRS 中的单个表中,需要将来自不同服务器的数据 UNION 或 JOIN 到单个记录集中,这样只需从 SSRS 连接一台服务器。

我已经创建了一个在 Management Studio 中运行时工作正常的存储过程,但是当我从 SSRS 报表生成器调用它时,该存储过程不起作用。

SSRS 在此处没有引入其他限制,执行查询的是数据库本身,因此,如果已将此查询封装在存储过程中,并证明它在通过 SSMS 执行时有效,则唯一的其他变量是安全上下文。因此,请检查 SSRS 连接所使用的用户帐户是否已被授予与测试所用用户帐户相同的权限,或使用 SSRS 帐户登录 SSMS 以验证是否可以执行存储过程。

要考虑的另一件事是,当您在 SMS 中测试此内容时,是否在 SSRS 报表连接到的同一台服务器上进行测试?如果两个环境中的安全上下文相同,则没有理由不这样做,只需确保将苹果与苹果进行比较即可。

回复:存储过程不起作用

不起作用非常模糊,您能否提供错误消息或解释结果?SQL Server 通常提供非常简洁的错误消息,我们可以使用这些错误消息来确定任何故障的具体原因。

替代解决方案

关键是使其中一个数据库能够查询其他数据库,这样我们的 SSRS 数据源就可以对其中一个数据库进行单个查询,并合并查询或 SP 中的数据。那么,我们如何在 SQL Server 中本地执行此操作呢?

链接服务器:sp_addlinkedserver允许您查询其他数据提供程序,如果链接服务器是 SQL Server 的实例,则可以执行远程存储过程。

  • Azure SQL DB 不支持此功能
  • 根据您的安全配置,您可能需要定义登录名,阅读有关链接服务器安全性的更多信息

外部表SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016SQL Server 2016 SQL Server 2016 SQL Server 2016 SQL Server 2016 SQL Server 2016 SQL Server 2016 SQL Server 2016 SQL Server 2016 SQL Server 2当然,您可以使用它来连接其他 SQL 数据库。这是一个抽象层,可能不会改善您当前的问题,但如果您仍然坚持下去,可能值得一看;)

  • 此解决方案适用于 Azure SQL DB,但在 Azure SQL 托管实例和 MS SQL Server 中也受支持

评论

0赞 Sanjay Chaudhary 11/4/2023
感谢您对这一特定点的回复 要考虑的另一件事是,当您在 SMS 中测试此内容时,您是否在 SSRS 报表连接到的同一台服务器上进行测试?如果两个环境中的安全上下文相同,则没有理由不这样做,只需确保将苹果与苹果进行比较即可。=> 是的,我已经在我的一台服务器中测试了该查询,并且它有效。您可以在服务器中运行该查询,它以类似的方式工作。
0赞 Sanjay Chaudhary 11/4/2023
主要问题是当我将存储过程写入其中一台服务器时,它确实执行了数据源,但是当 Procedure 将两个服务器都包含在查询中时,我找不到如何在 SSRS 报表中创建数据源的想法,因为您可以一次创建一个数据源并在您的报表中使用单个数据源,我猜?如果您需要有关该问题的更多信息,请告诉我。再次感谢您的回复 @Chris-schaller
0赞 Chris Schaller 11/5/2023
我不明白,在 SSRS 中,您只需连接到其中一台服务器。如果可以在 SSMS 中执行 SP,并且它从其他服务器返回数据,则只需使用该服务器即可。查询连接到多个数据库,因此你甚至不必尝试在 SSRS 中执行此操作。