SSRS с использованием top (@parameter) с параметрами отчета приводит к «недопустимому значению» - PullRequest
0 голосов
/ 24 октября 2018

Это на 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(), работающего с параметрами отчета.

1 Ответ

0 голосов
/ 24 октября 2018

Мне удалось создать быстрый отчет, в котором для параметров использовались как даты, так и целое число datediff, и оба они работали по одному и тому же запросу.Я получил ту же ошибку, когда параметр был текстовым, но когда я изменил его на целое число, это сработало.

Вот код отчета для проверки:

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
  <AutoRefresh>0</AutoRefresh>
  <DataSources>
    <DataSource Name="ODS">
      <DataSourceReference>KHSSQLODSPRD</DataSourceReference>
      <rd:SecurityType>None</rd:SecurityType>
      <rd:DataSourceID>dec28a21-e8a3-4a0c-ac30-1d88f88d8d0f</rd:DataSourceID>
    </DataSource>
  </DataSources>
  <DataSets>
    <DataSet Name="DataSet1">
      <Query>
        <DataSourceName>ODS</DataSourceName>
        <QueryParameters>
          <QueryParameter Name="@ReportParamStartDate">
            <Value>=Parameters!ReportParamStartDate.Value</Value>
          </QueryParameter>
          <QueryParameter Name="@ReportParamEndDate">
            <Value>=Parameters!ReportParamEndDate.Value</Value>
          </QueryParameter>
        </QueryParameters>
        <CommandText>select top(datediff(d, @ReportParamStartDate, @ReportParamEndDate) + 1)
--top(@datediffParam)
    identity(int, 0, 1) as n
into #TempTable
from sys.all_columns

select * from #TempTable</CommandText>
      </Query>
      <Fields>
        <Field Name="n">
          <DataField>n</DataField>
          <rd:TypeName>System.Int32</rd:TypeName>
        </Field>
      </Fields>
    </DataSet>
  </DataSets>
  <ReportSections>
    <ReportSection>
      <Body>
        <ReportItems>
          <Tablix Name="Tablix2">
            <TablixBody>
              <TablixColumns>
                <TablixColumn>
                  <Width>1in</Width>
                </TablixColumn>
              </TablixColumns>
              <TablixRows>
                <TablixRow>
                  <Height>0.25in</Height>
                  <TablixCells>
                    <TablixCell>
                      <CellContents>
                        <Textbox Name="Textbox22">
                          <CanGrow>true</CanGrow>
                          <KeepTogether>true</KeepTogether>
                          <Paragraphs>
                            <Paragraph>
                              <TextRuns>
                                <TextRun>
                                  <Value>n</Value>
                                  <Style>
                                    <FontFamily>Calibri</FontFamily>
                                    <FontWeight>Bold</FontWeight>
                                    <Color>DimGray</Color>
                                  </Style>
                                </TextRun>
                              </TextRuns>
                              <Style>
                                <TextAlign>Center</TextAlign>
                              </Style>
                            </Paragraph>
                          </Paragraphs>
                          <rd:DefaultName>Textbox19</rd:DefaultName>
                          <Style>
                            <Border>
                              <Color>LightGrey</Color>
                              <Style>None</Style>
                            </Border>
                            <BackgroundColor>LightGrey</BackgroundColor>
                            <VerticalAlign>Middle</VerticalAlign>
                            <PaddingLeft>2pt</PaddingLeft>
                            <PaddingRight>2pt</PaddingRight>
                            <PaddingTop>2pt</PaddingTop>
                            <PaddingBottom>2pt</PaddingBottom>
                          </Style>
                        </Textbox>
                      </CellContents>
                    </TablixCell>
                  </TablixCells>
                </TablixRow>
                <TablixRow>
                  <Height>0.25in</Height>
                  <TablixCells>
                    <TablixCell>
                      <CellContents>
                        <Textbox Name="Textbox40">
                          <CanGrow>true</CanGrow>
                          <KeepTogether>true</KeepTogether>
                          <Paragraphs>
                            <Paragraph>
                              <TextRuns>
                                <TextRun>
                                  <Value>=Fields!n.Value</Value>
                                  <Style>
                                    <FontFamily>Calibri</FontFamily>
                                    <Color>DimGray</Color>
                                  </Style>
                                </TextRun>
                              </TextRuns>
                              <Style>
                                <TextAlign>Center</TextAlign>
                              </Style>
                            </Paragraph>
                          </Paragraphs>
                          <rd:DefaultName>Textbox30</rd:DefaultName>
                          <Style>
                            <Border>
                              <Color>LightGrey</Color>
                              <Style>None</Style>
                            </Border>
                            <BackgroundColor>=CODE.AlternateColor("White", "AliceBlue", 1, 0)</BackgroundColor>
                            <VerticalAlign>Middle</VerticalAlign>
                            <PaddingLeft>2pt</PaddingLeft>
                            <PaddingRight>2pt</PaddingRight>
                            <PaddingTop>2pt</PaddingTop>
                            <PaddingBottom>2pt</PaddingBottom>
                          </Style>
                        </Textbox>
                      </CellContents>
                    </TablixCell>
                  </TablixCells>
                </TablixRow>
              </TablixRows>
            </TablixBody>
            <TablixColumnHierarchy>
              <TablixMembers>
                <TablixMember />
              </TablixMembers>
            </TablixColumnHierarchy>
            <TablixRowHierarchy>
              <TablixMembers>
                <TablixMember>
                  <KeepWithGroup>After</KeepWithGroup>
                </TablixMember>
                <TablixMember>
                  <Group Name="Details" />
                </TablixMember>
              </TablixMembers>
            </TablixRowHierarchy>
            <DataSetName>DataSet1</DataSetName>
            <Height>0.5in</Height>
            <Width>1in</Width>
            <Style>
              <Border>
                <Style>None</Style>
              </Border>
            </Style>
          </Tablix>
        </ReportItems>
        <Height>0.5in</Height>
        <Style />
      </Body>
      <Width>8.5in</Width>
      <Page>
        <PageHeight>8.5in</PageHeight>
        <PageWidth>11in</PageWidth>
        <LeftMargin>1in</LeftMargin>
        <RightMargin>1in</RightMargin>
        <TopMargin>1in</TopMargin>
        <BottomMargin>1in</BottomMargin>
        <Style />
      </Page>
    </ReportSection>
  </ReportSections>
  <ReportParameters>
    <ReportParameter Name="ReportParamStartDate">
      <DataType>DateTime</DataType>
      <DefaultValue>
        <Values>
          <Value>1/1/2018 12:00:00 AM</Value>
        </Values>
      </DefaultValue>
      <Prompt>Report Param Start Date</Prompt>
    </ReportParameter>
    <ReportParameter Name="ReportParamEndDate">
      <DataType>DateTime</DataType>
      <DefaultValue>
        <Values>
          <Value>2/1/2018 12:00:00 AM</Value>
        </Values>
      </DefaultValue>
      <Prompt>Report Param End Date</Prompt>
    </ReportParameter>
    <ReportParameter Name="datediffParam">
      <DataType>Integer</DataType>
      <DefaultValue>
        <Values>
          <Value>12</Value>
        </Values>
      </DefaultValue>
      <Prompt>datediff Param</Prompt>
    </ReportParameter>
  </ReportParameters>
  <ReportParametersLayout>
    <GridLayoutDefinition>
      <NumberOfColumns>4</NumberOfColumns>
      <NumberOfRows>2</NumberOfRows>
      <CellDefinitions>
        <CellDefinition>
          <ColumnIndex>0</ColumnIndex>
          <RowIndex>0</RowIndex>
          <ParameterName>ReportParamStartDate</ParameterName>
        </CellDefinition>
        <CellDefinition>
          <ColumnIndex>1</ColumnIndex>
          <RowIndex>0</RowIndex>
          <ParameterName>ReportParamEndDate</ParameterName>
        </CellDefinition>
        <CellDefinition>
          <ColumnIndex>2</ColumnIndex>
          <RowIndex>0</RowIndex>
          <ParameterName>datediffParam</ParameterName>
        </CellDefinition>
      </CellDefinitions>
    </GridLayoutDefinition>
  </ReportParametersLayout>
  <Code>Public bOddRow(10) As Boolean 

Function AlternateColor(ByVal OddColor As String, ByVal EvenColor As String, ByVal Toggle As Boolean, ByVal Type AS INTEGER) As String 

  If Toggle Then bOddRow(Type) = Not bOddRow(Type) 

  If bOddRow(Type) Then 
                Return OddColor 
  Else 
                Return EvenColor 
  End If 

End Function</Code>
  <Language>en-US</Language>
  <ConsumeContainerWhitespace>true</ConsumeContainerWhitespace>
  <rd:ReportUnitType>Inch</rd:ReportUnitType>
  <rd:ReportID>93b48dbc-8a58-48e4-a4a5-2dcdf6700445</rd:ReportID>
</Report>

Вот предварительный просмотр: Preview

...