Sql server SSRS-到2000个数据库的单一数据源连接
我的项目是为一家拥有2000多家店铺的零售巨头设计的。数据在每个存储中收集,并在其自己的本地存储数据库中维护,其中包含许多表(数据库结构对于所有存储都是相同的,包括表结构) 因此,我需要为每个商店的数据库使用不同的连接字符串。我想知道我是否可以在SSRS中创建一个报告,通过它我可以选择商店并访问信息Sql server SSRS-到2000个数据库的单一数据源连接,sql-server,reporting-services,ssrs-2008-r2,Sql Server,Reporting Services,Ssrs 2008 R2,我的项目是为一家拥有2000多家店铺的零售巨头设计的。数据在每个存储中收集,并在其自己的本地存储数据库中维护,其中包含许多表(数据库结构对于所有存储都是相同的,包括表结构) 因此,我需要为每个商店的数据库使用不同的连接字符串。我想知道我是否可以在SSRS中创建一个报告,通过它我可以选择商店并访问信息 是否有一种方法可以将所有2000个连接映射到单个数据源?您不能在单个数据源中创建2000个不同的源连接。您可以单独指定每个源连接。您可以创建视图,以将所有存储区中的数据合并到单个对象中,每个对象对应
是否有一种方法可以将所有2000个连接映射到单个数据源?您不能在单个数据源中创建2000个不同的源连接。您可以单独指定每个源连接。您可以创建视图,以将所有存储区中的数据合并到单个对象中,每个对象对应于您希望访问的表。如果每个存储的数据库结构相同,并且可以驻留在SQL Server的单个实例上,则可以通过编程方式创建这些视图,然后您的报表可以通过其数据源连接到该实例 例如,假设您的数据库只有两个表:
CREATE TABLE sales (
SaleID INT,
CustomerID INT,
Amount DECIMAL(19,4)
)
CREATE TABLE staff (
StaffID INT,
Name VARCHAR(50),
YearsService INT
)
假设您只有3个存储区,每个存储区都有一个SQL实例,您可以从包含数据库CompanyData
的中心位置(设置为链接服务器)连接到该实例:
SELECT * FROM Store1.CompanyData.dbo.sales
SELECT * FROM Store2.CompanyData.dbo.sales
SELECT * FROM Store3.CompanyData.dbo.sales
您可以运行如下游标,为数据库中的两个表生成CREATE VIEW
脚本:
DECLARE @SalesSQL VARCHAR(MAX) = 'CREATE VIEW dbo.GlobalSales AS '
DECLARE @StaffSQL VARCHAR(MAX) = 'CREATE VIEW dbo.GlobalStaff AS '
DECLARE @currentServer NVARCHAR(128)
DECLARE allServers CURSOR FOR
SELECT name
FROM SYS.SERVERS
WHERE is_linked = 1
OPEN allServers
FETCH NEXT FROM allServers INTO @currentServer
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SalesSQL = @SalesSQL + ' SELECT ''' + @currentServer + ''' AS [Server], SaleId, CustomerID, Amount FROM ' + QUOTENAME(@currentServer) + '.CompanyData.dbo.Sales UNION ALL'
SET @StaffSQL = @StaffSQL + ' SELECT ''' + @currentServer + ''' AS [Server], StaffId, Name, YearsService FROM ' + QUOTENAME(@currentServer) + '.CompanyData.dbo.Staff UNION ALL'
FETCH NEXT FROM allServers INTO @currentServer
END
CLOSE allServers
DEALLOCATE allServers
SET @SalesSQL = LEFT(@SalesSQL,LEN(@SalesSQL)-6)
SET @StaffSQL = LEFT(@StaffSQL,LEN(@StaffSQL)-6)
EXEC sp_executesql @SalesSQL
EXEC sp_executesql @StaffSQL
这将给您留下两个视图GlobalSales
和GlobalStaff
,它们位于同一台SQL Server上,可以通过SSRS报告中的单个数据源连接到
如果数据库中有大量表,则可以通过动态获取数据库中每个相关表的详细信息来进一步自动化该过程,而不是像我上面所说的那样明确指定它们。
UNION ALL
在这种情况下可能比UNION
有更好的性能,但很难想象这两种方法都是一份报告可以接受的答案。@JamieF fair point,但在我精心设计的示例中,我们永远不会删除任何重复的记录-这是否一定意味着UNION-ALL
将比UNION
执行得更好?出于兴趣,为什么您认为这种方法是不可接受的?我并不反对它不是特别优雅,也不觉得“整洁”,但它会起作用,不是吗?如果你没有复制品,UNION ALL
会更好UNION-ALL
甚至不会查找重复项,其中UNION
将查找重复项1999次。你的方法有效吗?是的,可能。但此表的每个查询都将查询2000个数据库。如果它们在不同的服务器上,我不会对糟糕的性能感到惊讶。@JamieF公平地说,我认为某种数据仓库将是更好的解决方案(如果数据库基础设施本身无法集中化)-即使它像每晚从每个存储到某个中央数据库的数据转储一样原始,然后OP可以根据需要查询该中央数据库?是的,然后可以在合并表上创建索引,即使保存在关系存储中,性能也会更好。OLAP或其他面向报告的存储将更有帮助。报告来自2000个地点的数据一直都在进行,但通常不通过连接2000个数据库来完成。公司对此有报告策略吗?如果一家拥有2000家零售店的公司没有一个像样的集中报告策略,我会感到惊讶。可能已经有一些用于数据提取或复制的常规作业正在运行,可以帮助您避免此问题。