Это на SQL Server 2016 и SSRS 2016.
У меня есть набор данных, с которого я начинаю, создав список дат с помощью запроса, подобного следующему:
declare @StartDate date = '2018-07-01';
declare @EndDate date = '2018-09-30';
if object_id('tempdb..#TempTable') is not null drop table #TempTable;
select top(datediff(d, @StartDate, @EndDate) + 1)
identity(int, 0, 1) as n
into
#TempTable
from
sys.all_columns
Этоработает хорошо, когда я явно объявил даты начала и окончания в запросе набора данных.Я хотел бы, чтобы начальная и конечная даты были параметрами отчета, поэтому я удалил объявления и настроил параметры отчета для начальной даты (с именем ReportParamStartDate) и конечной даты (с именем ReportParamEndDate), обе из которых установлены как даты, а не как нуль,и я дал им значения по умолчанию «2018-07-01» и «2018-09-30» соответственно.Сами параметры кажутся хорошими, я могу получить их, используя простой запрос select @ReportParamStartDate
, и отобразить их в отчете.Однако, когда я изменяю свой запрос следующим образом, я получаю сообщение об ошибке:
if object_id('tempdb..#TempTable') is not null drop table #TempTable;
select top(datediff(d, @ReportParamStartDate, @ReportParamEndDate) + 1)
identity(int, 0, 1) as n
into
#TempTable
from
sys.all_columns
Я получаю следующее сообщение:
Предложение TOP или FETCH содержит недопустимое значение.
Я попытался зайти в свойства «Параметры» для набора данных, и я установил @StartDate
= [@ReportParamStartDate]
, а также дату окончания, и снова изменил свой запрос, чтобы использовать @StartDate
и @EndDate
.Но это приводит к той же ошибке.
Я подумал, что, возможно, смогу обойти это, добавив еще один параметр набора данных, равный датированному размеру, который я вычисляю.Я создал параметр набора данных с именем @DateDiffParam
и установил его равным =DateDiff("d", Parameters!ReportParamStartDate.Value, Parameters!ReportParamEndDate.Value) + 1
, а затем изменил свой запрос следующим образом:
if object_id('tempdb..#TempTable') is not null drop table #TempTable;
select top(@DateDiffParam)
identity(int, 0, 1) as n
into
#TempTable
from
sys.all_columns
Это теперь дает мне следующую ошибку:
Количество строк, указанное для параметра количества строк в предложениях TOP или FETCH, должно быть целым числом.
Поэтому я попытался добавить CInt
в выражение, но это привело к той же ошибке.Я немного искал и нашел, что кто-то исправил эту ошибку, выполнив select top (1 * @parameter)
, но добавление 1 *
к моему запросу приводит к исходной ошибке.
Если я вычисляю дату в качестве параметра отчета (устанавливается какInteger) и использовать это в запросе, что также приводит ко второй ошибке, и попытка решения 1 * @parameter
для этого метода также возвращает к исходной ошибке.
На данный момент единственное решение, которое яможно подумать, это отфильтровать набор данных.Но я хотел бы избежать этого, если это возможно, поэтому я надеюсь, что есть кое-что, чего мне не хватает в отношении получения предложения top()
, работающего с параметрами отчета.