SSRS - 与2,000个数据库的单一数据源连接

时间:2016-12-28 13:34:32

标签: sql-server reporting-services ssrs-2008-r2

我的项目适用于拥有2,000多家商店的零售巨头。数据在每个商店中收集并在其自己的本地商店数据库中维护,其中包含许多表(所有商店的DB结构都相同,包括表结构)。

因此,我需要为每个商店的数据库使用不同的连接字符串。我想知道我是否可以在SSRS中创建报告,通过该报告我可以选择商店并访问信息。

有没有办法可以将所有2,000个连接映射到单个数据源?

2 个答案:

答案 0 :(得分:0)

您无法在单个内部创建2000个不同的源连接。您可以单独指定每个源连接。

答案 1 :(得分:0)

您可以创建UNION ALL个来自所有商店的数据到一个对象的视图 - 您希望访问的每个表一个。如果每个商店的数据库的结构相同并且可以驻留在您的报告可以通过其数据源连接到的单个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

这将为您提供两个视图GlobalSalesGlobalStaff,这两个视图位于同一个SQL Server上,并且可以通过SSRS报告与单个数据源连接。

如果数据库中有大量表,则可以通过动态获取数据库中每个相关表的详细信息来进一步自动化该过程,而不是像上面那样明确指定它们。