пользователям программных продуктов Scala 5.1, iScala 2.1, iScala 2.2, iScala 2.3, iScala 3.0, iScala 3.1, iScala 3.2, iScala 3.3 (и так далее)

Как использовать отчётность SSRS, если у вас старая версия (2000) SQL сервера?

В нескольких знакомых мне компаниях такая ситуация: очень старая версия iScala и ещё более древняя версия SQL сервера — SQL Server 2000. А у некоторых ситуация ещё круче, у них Scala 5.1, а не iScala. По разным причинам они не переходят на новую версию iScala, хотя имеют право получить её бесплатно. Одно из препятствий — необходимость обновления всего компьютерного парка. Так или иначе, установить компонент Reporting Services не представляется возможным, так как до появления SQL Server 2005 этот компонент не входил в комплект поставки SQL Server 2000 и его нужно было получать отдельно. В своё время его не получили, а сейчас и не известно, возможно ли это даже теоретически.

Разумеется, можно было бы использовать более новую версию SQL сервера, но покупать его отдельно никто не хочет, хочется использовать бесплатную версию с дополнительными компонентами:

Express With Advanced Tools Installation File Properties

Но вот незадача, Reporting Services в бесплатной экспресс версии с дополнительными компонентами не умеет работать с «чужими» серверами, т.е. вы не можете просто установить на соседний сервер бесплатную версию SQL Server Express Advanced Edition в качестве сервера отчетов и создать источник данных, обращающийся на соседний сервер, выдаётся сообщение об ошибке: «Для используемого выпуска служб Reporting Services необходимо, чтобы для источников данных отчетов и базы данных сервера отчётов применялись локальные реляционные базы данных SQL Server»:

SQL Server Express With Advanced Tools Remote Server Error Message

Это ограничение бесплатной Express версии.

Означает ли это, что мы не можем её использовать? Нет, не означает. Ниже я попытаюсь описать, что можно сделать, чтобы заставить экспресс версию работать с данными из базы данных основного SQL сервера (со старой версией).

Сначала попытаемся в базе данных SQL Server Express Advanced Edition (т.е. на новом сервере с бесплатной версией SQL, которую мы хотим использовать в качестве сервера отчётности) создать Linked Server. Проблема эта нетривиальная, т.к. моя версия SQL, т.е. SQL Server 2012 Express Advanced Edition по умолчанию использует компонент, который не умеет подключаться к 2000 SQL серверу. Но это можно сделать с помощью SQL запроса примерно такого содержания:

EXEC sp_dropserver @server=N'W2003R2Q2000', @droplogins='droplogins'
GO

EXEC sp_addlinkedserver @server = N'W2003R2Q2000',
@srvproduct=N'MSDASQL',
@provider=N'MSDASQL',
@provstr=N'DRIVER={SQL Server};SERVER=W2003R2Q2000;Trusted_Connection=no;'

EXEC sp_addlinkedsrvlogin @rmtsrvname=N'W2003R2Q2000',
@useself=N'False',
@locallogin=NULL,
@rmtuser=N'sa',
@rmtpassword=N'xxxxxxxxx'
GO

В результате в разделе Linked Servers появится ссылка на сервер со старой версией SQL — т.е. на сервер, где хранятся базы данных Scala/iScala:

Express With Advanced Tools Add Linked Server

Теперь мы можем на сервере с SQL 2012 в качестве теста создать хранимую процедуру, выводящую список складов с нашего основного сервера (с SQL 2000):

Express With Advanced Tools Remote Server Local Stored Procedure

Создадим тестовый отчёт и опубликуем его на сервере, чтобы проверить, будет ли это работать:

Создадим тестовый отчёт и опубликуем его на сервере, чтобы проверить, будет ли это работать

Работает! А раз это работает у меня, то может работать и у вас 🙂