SSRS: базовый SQL использует «объединение всех» - результаты намного меньше установленных, чем ожидалось, - плюс лучший способ, чем Tablix-фильтрация - PullRequest
0 голосов
/ 26 октября 2018

Я использую SSRS, Visual Studio 2015, с базовым TSQL.SSRS использует определение 2016/01 / reportdefinition.

Мне нужно отфильтровать параметр (используя фильтр табликса с параметром like) с нижележащим оператором SQL:

SELECT col1 as result1, col2 as result2 FROM table1
UNION all
SELECT colA as result1, colB as result2 FROM table 2
order by result1

Оператор, похожий на Tablix:

="*" + Parameters!Result1.Value + "*"

Я бы предположил , что параметр приведет к тому, что базовое предложение where будет применено к обоим операторам SQL в приведенном выше UNION all, но я неЯ точно не знаю.[Это предположение не правильно: см. Ответы ниже]

SQL-сервером для проекта является SQL Server 2008 R2, 2012 или 2014.

В любом случае, когдаЯ запускаю запрос с операторами where в SSMS [v 17.7], он очень быстрый и возвращает 12 результатов.

Но когда я запускаю запрос в предварительном просмотре rdl-файла для SSRS, это очень медленно.Поэтому я использую оператор:

 Set Rowcount 1000

.Однако он возвращает только 1 результат вместо 12. Если я уберу опцию «Установить количество строк», ничего полезного не произойдет, а в сообщении «Загрузка» будет просто вращающийся значок.

Кто-нибудь знает, какзапросы модифицируются для фильтрации по параметру, и почему возвращается меньше результатов, чем ожидалось?

Возможность: Запускает ли он запрос без указания где, ограничивает результаты до 1000, а затем, в зависимости от используемого порядка, исключает несколько возможных совпадений результатов?[Эта возможность на самом деле , что происходит, см. Ответы ниже]

ПРИМЕЧАНИЕ. Существует гораздо лучший способ, чем то, о чем спрашивается в исходном вопросе.Вместо tablix-фильтрации можно выполнить фильтр в SQL-запросе.Смотрите ответ от ОП.

Ответы [ 2 ]

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

Хотя ответ Алана Шофилда на этот вопрос полон, есть лучший способ, чем в исходном вопросе.

Наилучшим вариантом является сопоставление параметра.

Для этого можно использовать следующий синтаксис xml в соответствующем месте в rdl-файле:

<DataSets>
    <DataSet Name="DataSet1">
      <Query>
        <DataSourceName>MyDataSource</DataSourceName>
        <QueryParameters>
          <QueryParameter Name="@Result">
            <Value>=Parameters!Result.Value</Value>
          </QueryParameter>
        </QueryParameters>
        <CommandText>
          --------------------------------------------------------------------
          use MyDataSource;
          --------------------------------------------------------------------
          select col1 as result1,  col2 as result2 from table1 a
          where  col1 LIKE '%' + @Result + '%'
          Union all
          select colA as result1,  colB as result2 from table2 b
          where  colA  LIKE '%' + @Result + '%'
          order by  result1,  
          --------------------------------------------------------------------</CommandText>
        <rd:UseGenericDesigner>true</rd:UseGenericDesigner>
      </Query>
0 голосов
/ 26 октября 2018

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

В вашем запросе может использоваться неверный план, вы можете легко проверить это, добавивВАРИАНТ (RECOMPILE) до конца вашего запроса к набору данных.Это заставит план воссоздать.Не устанавливайте количество строк, иначе вы не получите истинного теста.

Если ваш запрос к набору данных все еще медленно выполняется в SSRS, попробуйте выполнить трассировку для соединения с помощью Profiler (из меню инструментов SSMS).и убедитесь, что выполняемый SQL соответствует вашим ожиданиям.

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

...