Фиксируются ли параметры ssrs при создании отчета?

Я использовал следующий код в своих SQL-запросах:

DECLARE @CurrentDate DateTime = Getdate()

Затем я ссылаюсь на @CurrentDate вместо того, чтобы использовать функцию Getdate () несколько раз в одном запросе. Это полезно, потому что значение @CurrentDate не изменяется во время выполнения запроса.

Однако я начал преобразовывать некоторые из этих переменных в параметры, установленные SSRS. Это позволяет пользователю изменять параметр @CurrentDate, который полезен по разным причинам. Обычно значение по умолчанию устанавливается равным «= Now ()» или некоторому выражению, содержащему функцию Now ().

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

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

Насколько мне известно, параметр будет пересчитан только тогда, когда пользователь повторно откроет отчет. Кроме того, насколько мне известно, SQL Server в настоящее время оценивает GETDATE() только один раз за запрос, но, конечно, это поведение может меняться между версиями SQL Server.

Wolfgang Kais 11.08.2018 02:30
0
1
24
2

Ответы 2

Все зависит от того, что вы подразумеваете под «последовательным». Возьмем, к примеру, эти два сценария:

--Method #1
UPDATE tracker.shipment SET delivery_date = GETDATE() WHERE delivery_id = 1;
WAITFOR DELAY '00:00:01';
UPDATE tracker.shipment SET delivery_date = GETDATE() WHERE delivery_id = 2;

--Method #2
DECLARE @current_date DATETIME = GETDATE();
UPDATE tracker.shipment SET delivery_date = @current_date WHERE delivery_id = 1;
WAITFOR DELAY '00:00:01';
UPDATE tracker.shipment SET delivery_date = @current_date WHERE delivery_id = 2;

Это псевдосценарий для обновления системы отслеживания, чтобы показать, когда была произведена доставка. Я бы сказал, что первая версия является более «последовательной», поскольку в ней записывается, когда действительно было выполнено обновление, а не произвольная дата / время с момента первого ввода хранимой процедуры.

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

Насколько мне известно, параметр, отправленный SSRS, будет оцениваться для определения времени сервера на сервере отчетов в момент, когда пользователь нажимает кнопку «Просмотреть отчет». Таким образом, каждый параметр с Now() будет иметь одинаковую дату и время, но это может немного отличаться от SQL Server, если ваши серверы не точно синхронизированы.

Это действительно важно? Ну, это полностью зависит от того, что вы делаете с датой / временем, которое вы прошли, я думаю. Когда ваши пользователи вводят произвольную дату / время, они вводят дату или полную дату / время? Я предполагаю, что они вводят только дату, поэтому она автоматически преобразуется в компонент времени 00: 00: 00.00?

По сути, мне нужно больше контекста, чтобы дать более полный ответ на этот вопрос.

Просто создайте параметр SSRS datetime и установите значение по умолчанию NOW (). Затем он будет считать все, но пользователи могут выбрать другую дату. Также обратите внимание, что SSRS использует параметры DATETIME, но для многих своих отчетов я фактически использую поле строковых параметров, которое я ОТКАЗЫВАЮ на DATE, чтобы избежать потери данных между часами, которые пользователь не ожидает:

WHERE CAST(StartDate AS DATE) > CAST(@StartDateParam AS DATE)

Другие вопросы по теме