我的項目針對擁有超過2,000家商店的零售巨頭。數據收集在每個商店中,並在其自己的本地商店數據庫中使用多個表進行維護(所有商店的數據庫結構都相同,包括表結構)。SSRS - 與2,000個數據庫的單個數據源連接
因此,我需要每個商店的數據庫不同的連接字符串。我想知道是否可以在SSRS中創建報告,以便我可以選擇商店並訪問信息。
有沒有一種方法可以將所有2,000個連接映射到單個數據源?
我的項目針對擁有超過2,000家商店的零售巨頭。數據收集在每個商店中,並在其自己的本地商店數據庫中使用多個表進行維護(所有商店的數據庫結構都相同,包括表結構)。SSRS - 與2,000個數據庫的單個數據源連接
因此,我需要每個商店的數據庫不同的連接字符串。我想知道是否可以在SSRS中創建報告,以便我可以選擇商店並訪問信息。
有沒有一種方法可以將所有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家店,每一個SQL實例,你可以從你的中心位置連接到(設置爲
SELECT * FROM Store1.CompanyData.dbo.sales
SELECT * FROM Store2.CompanyData.dbo.sales
SELECT * FROM Store3.CompanyData.dbo.sales
你可以運行一個光標類似下面來生成你的數據庫CREATE VIEW
腳本的兩個表:
CompanyData
鏈接服務器)
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公平點,但我們永遠不會有任何重複的記錄在我頗爲人爲的例子中刪除 - 這是否意味着'UNION ALL'會比'UNION'執行得更好?出於利益您爲什麼認爲這種方法是不可接受的?我並不認爲這不是特別優雅,並不覺得「整潔」,但它會起作用,不是嗎? – 3N1GM4
如果你沒有重複,'UNION ALL'會好很多。 'UNION ALL'甚至不會查找重複項,其中'UNION'會在1999年查找重複項。 您的方法會工作嗎?是的,可能。但是這個表的每個查詢都會查詢2000個數據庫。如果這些服務器位於不同的服務器上,我不會對可怕的性能感到驚訝。 –
您不能在單個內創建2000個不同的源連接。您可以分別指定每個源連接。
公司是否有此報告策略?如果一家擁有2000個零售店的公司沒有適合集中報告的體面策略,我會感到驚訝。數據提取或複製可能已經有一些正常的作業運行,可以幫助您避免此問題。 –