2016-12-28 2 views
2

Мой проект предназначен для розничного гиганта, который имеет более 2000 магазинов. Данные собираются в каждом хранилище и хранятся в собственной базе данных локального хранилища с рядом таблиц (структура БД одинакова для всех магазинов, включая структуру таблицы).SSRS - одно соединение источника данных с 2000 базами данных

Поэтому мне нужна другая строка соединения для каждой базы данных магазина. Мне было интересно, могу ли я создать отчет в SSRS, с помощью которого я могу выбрать магазины и получить доступ к этой информации.

Есть ли способ, которым я могу сопоставить все 2000 соединений с одним источником данных?

+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 
) 

и давайте предположим, что у вас есть только три магазина, каждый с SQL, например, вы можете подключиться с вашего центрального местоположения (установлен как Связанные серверы), содержащие базу данных 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.

Если у вас очень много таблиц в ваших базах данных, вы можете дополнительно автоматизировать процесс, динамически извлекая детали каждой соответствующей таблицы в базах данных, вместо того, чтобы явно указывать их, как я уже говорил выше.

+0

'UNION ALL', вероятно, будет иметь гораздо лучшую производительность в этом случае по сравнению с UNION, но трудно представить либо приемлемый ответ для одного отчета. –

+0

@JamieF справедливая точка, но у нас никогда не будет дубликатов записей для удаления в моем довольно надуманном примере - будет ли это определенно означать, что 'UNION ALL' будет работать лучше, чем' UNION'? Из интереса почему, по-вашему, этот подход неприемлем? Я не согласен, что это не особенно элегантно и не кажется «опрятным», но это сработает, не так ли? – 3N1GM4

+0

Если у вас нет дубликатов, 'UNION ALL' будет намного лучше. 'UNION ALL' даже не будет искать дубликаты, где' UNION' будет искать дубликаты в 1999 году. Будет ли ваш подход работать? Да, наверное. Но каждый запрос этой таблицы будет запрашивать 2000 баз данных. Если они находятся на разных серверах, я не удивлюсь ужасной производительности. –

0

Вы не можете создать 2000 различных исходных соединений в одном. Вы можете указать каждое подключение источника отдельно.