2016-12-28 53 views
2

我的項目針對擁有超過2,000家商店的零售巨頭。數據收集在每個商店中,並在其自己的本地商店數據庫中使用多個表進行維護(所有商店的數據庫結構都相同,包括表結構)。SSRS - 與2,000個數據庫的單個數據源連接

因此,我需要每個商店的數據庫不同的連接字符串。我想知道是否可以在SSRS中創建報告,以便我可以選擇商店並訪問信息。

有沒有一種方法可以將所有2,000個連接映射到單個數據源?

+2

公司是否有此報告策略?如果一家擁有2000個零售店的公司沒有適合集中報告的體面策略,我會感到驚訝。數據提取或複製可能已經有一些正常的作業運行,可以幫助您避免此問題。 –

回答

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實例,你可以從你的中心位置連接到(設置爲

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

你可以運行一個光標類似下面來生成你的數據庫CREATE VIEW腳本的兩個表:

012包含數據庫 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 

然後,您將看到兩個視圖GlobalSalesGlobalStaff,這兩個視圖位於同一個SQL Server上,並且可以通過SSRS報告與單個數據源連接。

如果您的數據庫中有大量表,您可以通過動態獲取數據庫中每個相關表的詳細信息來進一步自動化該過程,而不是像上面那樣顯式指定它們。

+0

'UNION ALL'在這種情況下可能會比'UNION'有更好的表現,但很難想象這是一個報告可以接受的答案。 –

+0

@JamieF公平點,但我們永遠不會有任何重複的記錄在我頗爲人爲的例子中刪除 - 這是否意味着'UNION ALL'會比'UNION'執行得更好?出於利益您爲什麼認爲這種方法是不可接受的?我並不認爲這不是特別優雅,並不覺得「整潔」,但它會起作用,不是嗎? – 3N1GM4

+0

如果你沒有重複,'UNION ALL'會好很多。 'UNION ALL'甚至不會查找重複項,其中'UNION'會在1999年查找重複項。 您的方法會工作嗎?是的,可能。但是這個表的每個查詢都會查詢2000個數據庫。如果這些服務器位於不同的服務器上,我不會對可怕的性能感到驚訝。 –

0

您不能在單個內創建2000個不同的源連接。您可以分別指定每個源連接。