我的项目是针对拥有2,000多家商店的零售巨头。数据收集在每个商店中,并在其自己的本地商店数据库中保存,并带有许多表(所有商店的数据库结构都是相同的,包括表结构)。
因此,我需要每个商店数据库的不同连接字符串。我想知道是否可以在SSR中创建报告,可以通过该报告选择商店并访问信息。
有没有一种方法可以将所有2,000个连接映射到单个数据源?
您可以为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家商店,每个商店都可以从中央位置(设置为链接服务器设置),其中包含数据库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报告中的单个数据源连接。
如果数据库中有大量表,则可以通过动态获取数据库中每个相关表的详细信息来进一步自动化该过程,而不是像我上面一样明确指定它们。
<</p>您不能在单个内部创建2000个不同的源连接。您可以分别指定每个源连接。