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
这将为您留下两个视图 GlobalSales
和 GlobalStaff
,它们位于同一 SQL 服务器上,并且可以连接到来自 SSRS 报告的单个数据源。
如果您的数据库中有大量 table,您可以通过动态获取数据库中每个相关 table 的详细信息来进一步自动化该过程,而不是指定它们明确如上。
我的项目是针对一家拥有 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
这将为您留下两个视图 GlobalSales
和 GlobalStaff
,它们位于同一 SQL 服务器上,并且可以连接到来自 SSRS 报告的单个数据源。
如果您的数据库中有大量 table,您可以通过动态获取数据库中每个相关 table 的详细信息来进一步自动化该过程,而不是指定它们明确如上。