Объединить «как» и «в» в запросе служб отчетов SqlServer? - PullRequest
2 голосов
/ 04 ноября 2008

Следующее не работает, но что-то вроде этого - то, что я ищу.

select *
from Products
where Description like (@SearchedDescription + %)

SSRS использует оператор @ перед параметром для имитации 'in', и я не нахожу способ сопоставить строку со списком строк.

Ответы [ 5 ]

4 голосов
/ 17 ноября 2008

Существует несколько вариантов использования оператора LIKE с параметром.

ВАРИАНТ 1

Если вы добавите% к значению параметра, то вы можете настроить обработку фильтра LIKE. Например, ваш запрос может быть:

 SELECT name
 FROM master.dbo.sysobjects
 WHERE name LIKE @ReportParameter1

Чтобы набор данных правильно использовал оператор LIKE, можно использовать значение параметра, например sysa%. Когда я тестировал образец отчета в SSRS 2008 с использованием этого кода, я вернул следующие четыре таблицы:

 sysallocunits
 sysaudacts
 sysasymkeys
 sysaltfiles

ВАРИАНТ 2

Еще один способ сделать это, не требующий от пользователя добавления какого-либо символа «%», - сгенерировать переменную с кодом и превысить ее.

 DECLARE @DynamicSQL NVARCHAR(MAX) 

 SET @DynamicSQL = 
 'SELECT  name, id, xtype
 FROM dbo.sysobjects
 WHERE name LIKE ''' + @ReportParameter1 + '%''
 '

 EXEC (@DynamicSQL)

Это даст вам лучший контроль над тем, как будет использоваться инструкция LIKE. Если вы не хотите, чтобы пользователи вводили какие-либо дополнительные операторы, вы всегда можете добавить код для удаления не алфавитно-цифровых символов перед его объединением в окончательный запрос.

ВАРИАНТ 3

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

ВАРИАНТ 4

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

0 голосов
/ 25 сентября 2018

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

Как написано, это решение работает только в SQL Server 2016 и более поздних версиях, но его можно адаптировать для более старых версий, написав пользовательский string_split UDF и используя подзапрос вместо CTE.

Во-первых, сопоставьте вашу @SearchedDescription с набором данных в виде одной строки, используя JOIN:

=JOIN(@SearchedDedscription, ",")

Затем используйте STRING_SPLIT, чтобы отобразить строку типа «A, B, C, D» в табличную структуру.

;with
SearchTerms as (
  select distinct
    Value
  from 
    string_split(@SearchedDescription, ',')
)
select distinct
  *
from
  Products
  inner join SearchTerms on
    Products.Description like SearchTerms.Value + '%'

Если кто-то добавит один и тот же термин поиска несколько раз, это приведет к дублированию строк в наборе результатов. Аналогичным образом, один продукт может соответствовать нескольким условиям поиска. Я добавил distinct и в SearchTerms CTE, и в основной запрос, чтобы попытаться подавить это неуместное дублирование строк.

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

0 голосов
/ 06 ноября 2009

поставить так:

select * 
from tsStudent 
where studentName like @SName+'%'
0 голосов
/ 13 мая 2009

Дано, какую версию SSRS вы используете? Если это RS2000, список с несколькими параметрами официально не поддерживается, но есть обходной путь ....

0 голосов
/ 10 ноября 2008

Вы пытались сделать:

select * from Products where Description like (@SearchedDescription + '%') (Помещение одинарных кавычек вокруг знака%?)

...