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

SSRS - single Data Source connection to 2,000 databases

我的项目是针对一家拥有 2,000 多家商店的零售巨头。数据在每个商店中收集并维护在其自己的本地商店数据库中,具有多个 tables(所有商店的数据库结构都相同,包括 table 结构)。

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

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

您不能在一个连接内创建 2000 个不同的源连接。您可以分别指定每个源连接。

您可以创建视图 UNION ALL 来自所有商店的数据到一个对象中 - 每个 table 您希望访问的对象。如果每个商店的数据库结构相同并且可以驻留在 SQL 服务器的单个实例上,则可以通过编程方式创建这些视图,然后您的报告可以通过其数据源连接到该服务器。

举个例子,假设您的数据库只有两个 table:

CREATE TABLE sales (
    SaleID INT,
    CustomerID INT,
    Amount DECIMAL(19,4)
)

CREATE TABLE staff (
    StaffID INT,
    Name VARCHAR(50),
    YearsService INT
)

并且假设您只有 3 家商店,每个商店都有一个 SQL 实例,您可以从包含数据库 CompanyData:[=18 的中央位置(设置为链接服务器)连接到=]

SELECT * FROM Store1.CompanyData.dbo.sales
SELECT * FROM Store2.CompanyData.dbo.sales
SELECT * FROM Store3.CompanyData.dbo.sales

您可以 运行 像下面这样的游标来为数据库中的两个 table 生成 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 服务器上,并且可以连接到来自 SSRS 报告的单个数据源。

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