Службы отчетов SQL Server - можно ли выбрать базу данных как часть отчета - PullRequest
0 голосов
/ 15 января 2010

Мы опробовали службы отчетов SQL-сервера. Мы используем SQL 2008 и Visual Studio 2008.

У меня есть пара связанных отчетов, как
Отчет1 : Сводка заявок, которые все еще открыты после даты, когда они должны были закрыться. Нажмите на строку, чтобы:
Отчет2 : сведения о заявке и зависимые данные истории.

У нас есть около десяти баз данных, по одной для каждого клиента, с именами вроде «TicketsDatabase_ClientA», «TicketsDatabase_BCustomer».
Я развернул эти отчеты на сервере SSRS для внутреннего просмотра и тестирования, используя «TicketsDatabase_ClientA» в качестве базы данных источника данных.

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

Но я бы хотел развернуть их для данных всех клиентов. Как проще всего развернуть эти отчеты, чтобы мы могли просматривать данные всех клиентов? В идеале отчет должен начинаться с раскрывающегося списка для выбора клиента по имени, а затем переходить к соответствующей базе данных.

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

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


Обновление:

В результате мы получили динамический SQL - отчеты имеют параметр, связанный с набором данных для выбора базы данных, и основной набор данных с использованием оператора SQL exec, например,

declare @dbName varchar(64)

 SET @dbName = 
(SELECT 'TicketsDatabase_' + db.[Name]
 FROM MainDb.dbo.Clients db (nolock)
 WHERE db.Id = @clientId)

 EXECUTE ('USE ' + @dbName + '

SELECT Datatable.*
FROM ...
WHERE ...')

Ответы [ 4 ]

1 голос
/ 15 января 2010

Я хотел бы рассмотреть возможность использования ReportViewer в локальном режиме

Это позволяет управлять подключением к базе данных ASP.NET, а не службами Reporting Services.

Использование чистого решения SSRS здесь неудобно, как вы упомянули.

1 голос
/ 20 января 2010

Я не знаю, соответствует ли это вашему запросу о "наилучшей практике" или его лучше описать как "мерзкий взлом" :) Однако вот что мы делаем в этой ситуации:

У нас есть центральная база данных. В ней есть таблица с названием Базы данных со списком имен клиентов и баз данных. Например:

ClientName      DatabaseName
Client A        TicketsDatabase_ClientA
B Customer      TicketsDatabase_BCustomer

Мы добавляем набор данных в отчет под названием Базы данных, который имеет следующий оператор Sql:

SELECT ClientName, DatabaseName FROM Databases

Мы добавляем строковый параметр в отчет под названием База данных, который использует этот набор данных в качестве своего параметра «Из запроса», где в поле Значение указано значение DatabaseName, а в поле метки указано ClientName. Мы также добавляем небольшую метку шрифта 6pt в заголовок отчета с выражением = Parameters! Database.Label, чтобы мы знали, какую базу данных использует этот отчет.

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

Теперь нам просто нужно обновить оператор Sql для нашего основного набора данных, на котором основан отчет, чтобы получать информацию из правильной базы данных, например, так (помните, что оператор Sql является просто строковым выражением, как и все остальное в Reporting Услуги, вы можете построить его динамически):

="SELECT Field1, Field2, Field3 "
&"FROM " & Parameters!Database.Value & ".dbo.MyTable "

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

Конечно, это предполагает, что ваши структуры таблиц одинаковы для данных, о которых вы сообщаете.

1 голос
/ 15 января 2010

Отказ от ответственности: я действительно использовал только SQL Server Reporting Services 2005

Я думаю, у вас есть три варианта.

1) Использовать строки динамического соединения ala sqlservercentral.com

2) Получить хранимую процедуру для выбора данных на основе ввода для вас.

3) Получить SSRS для получения данных из веб-службы.

0 голосов
/ 20 января 2010

Вы всегда можете получить пакет SSIS от SSRS.

Возможно, это может быть зацикливающийся контейнер , который может динамически собирать все данные для "каждого имени базы данных в таблице"

Таким образом, вам нужно будет только вставить новую строку в таблицу, и пакет служб SSIS автоматически получит данные.

...