Несколько отчетов в SSRS с использованием той же хранимой процедуры

У меня есть проект SSRS, в котором несколько отчетов используют одну и ту же хранимую процедуру. Все отчеты различны (очевидно), но источник данных тот же.

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

Все эти отчеты используют одну и ту же хранимую процедуру (например, sp_Transaction ), которая имеет 20+ параметров и возвращает более 100 полей. Способ, которым обрабатываются аргументы в хранимой процедуре, выглядит примерно так:

 ( ( tblTransaction.TransactionID = @TransactionId ) OR ( @TransactionId IS NULL AND ( @DateCreatedDaysRelative IS NULL OR (CAST(tblTransaction.Created AS DATE)) = CAST(DATEADD(DAY, @DateCreatedDaysRelative, GETDATE() ) AS DATE) ) AND ( ( @DateStartMonthsRelative IS NULL AND @DateEndMonthsRelative IS NULL ) OR ( tblTransaction.DateStart <= DATEADD(MONTH, @DateStartMonthsRelative, GETDATE() ) AND ( tblTransaction.DateEnd >= DATEADD(MONTH, @DateEndMonthsRelative, GETDATE() )) ) ) ) ) AND ( tblTransaction.Receipt = @ReceiptRequired OR @ReceiptRequired IS NULL ) AND ( @PubID = dbo.tblJournal.PubID OR @PubID IS NULL ) 

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

Поэтому мой вопрос: «Хорошая практика заключается в том, чтобы иметь одну общую большую часть кода, где половина входов и выходов не используется (за один раз по одному отчету) или создание отдельных хранимых процедур для каждого отчета с требуемыми входами и выходами ; или что-то вроде одной хранимой процедуры, но с динамическим sql?

Это не простой вопрос Да / Нет.

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

Я бы сказал, что плохие идеи:

  • Всегда используйте отдельный запрос / SP
  • Всегда используйте один и тот же запрос / SP

Куда поместить курсор (в основном создавая новые запросы или в основном используя тот же запрос) между этими двумя параметрами зависит от вас.

У обоих есть плюсы и минусы, которые на моей голове:

Отдельный запрос / SP

  • PRO: Индивидуальные запросы для каждого отчета, которые обрабатывают только «полезные» данные
  • CON: Если требуется обновление (например, изменение имени столбца или новый столбец, необходимый для примера), вам необходимо обновить x запросов вместо 1

Тот же запрос / SP

  • PRO: обновление может влиять на все отчеты, поэтому у вас меньше работы
  • CON: Обновление может влиять на все отчеты, поэтому вы можете иметь побочные эффекты

Это очень простая проблема «да / нет». Это ужасная, страшная идея .

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

В равной степени, если не более значительная проблема, это производительность . Этот процесс не будет масштабироваться каким-либо образом. Он не сможет использовать индексы, так как есть функции в предложении where, которые необходимо оценить для каждой строки. (есть способы смягчить эту проблему, но это сделает код менее понятным)

Является ли отчет запущенным часто, он перекомпилируется для каждого исполнения? План выполнения вряд ли будет эффективным для всех параметров, но если план будет кеширован, вызов proc с разными параметрами приведет к неизвестному времени выполнения. (опять же, есть способы смягчить это, но пострадает читаемость кода)

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

  • Определение отчета SSRS новее, чем сервер
  • Epicor 10 (ERP) Ошибка отчетности SSRS: максимум 1024 столбца возвращены
  • Перемещение только подписки с SSRS 2008 на SSRS 2012
  • Какие учетные данные необходимо передавать при доступе к отчету SSRS через URL-адрес?
  • Отчеты SSRS - множественные выборки Определение нескольких запросов
  • Отображение HTML-контента в отчете SSRS
  • C # RDLC Развернуть все / Свернуть все SubReport
  • SQL - объединение последовательных строк даты на основе столбца
  • sp_send_dbmail вставить файл mhtml в тело
  • SSRS объединяет и объединяет два отчета в один отчет
  • Несколько гипер-ссылок в одной ячейке в отчете SSRS
  • Давайте будем гением компьютера.