Каков наилучший способ поиска из необязательного параметра в запросе SQL в хранимой процедуре? - PullRequest
0 голосов
/ 26 апреля 2018

Когда речь идет о поисковой записи с необязательным параметром в хранимой процедуре SQL, из этих двух запросов. Оба возвращают одинаковые результаты. Учитывая производительность, какую вы будете использовать и почему?

У меня есть хранимая процедура, которая имеет несколько параметров поиска и будет искать в нескольких таблицах с объединениями из огромного набора записей.

DECLARE @EventName VARCHAR(100)
--SET @EventName = ''
--SET @EventName = NULL
SET @EventName = 'Coffee in Coffee Bean'

-- Query - 1
SELECT * 
FROM EventDetails
WHERE 
    1 = CASE 
           WHEN @EventName IS NULL OR @EventName = '' THEN 1 
           WHEN EventName LIKE '%'+ @EventName +'%' THEN 1 ELSE 0 
        END

-- Query - 2
SELECT * 
FROM EventDetails
WHERE 
    EventName LIKE '%' + CASE 
                            WHEN LEN(LTRIM(@EventName)) > 0 
                               THEN @EventName 
                               ELSE EventName 
                         END + '%' 

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Мои деньги на это:

IF ISNULL(@EventName), '') = ''
  SELECT * FROM EventDetails
ELSE
  SELECT * FROM EventDetails WHERE EventName = '%' + @EventName + '%'
0 голосов
/ 27 апреля 2018

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

DECLARE @OptionalFilter1 INT
DECLARE @OptionalFilter2 VARCHAR(100)
-- ...
DECLARE @OptionalFilterN BIT

SELECT
    YourColumns
FROM
    YourTable AS T
WHERE
    (@OptionalFilter1 IS NULL OR @OptionalFilter1 = T.Filter1Column) AND
    (@OptionalFilter2 IS NULL OR @OptionalFilter2 = T.Filter2Column) AND
    -- ...
    (@OptionalFilterN IS NULL OR @OptionalFilterN = T.FilterNColumn)

Для вашего примера будет:

DECLARE @EventName VARCHAR(100) = 'Coffee in Coffee Bean'

SELECT
    * 
FROM 
    EventDetails AS E
WHERE
    (@EventName IS NULL OR E.Event LIKE '%' + @EventName + '%')

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

0 голосов
/ 26 апреля 2018

Вы можете попробовать это, написав один запрос

SELECT * 
FROM EventDetails
WHERE ((@EventName IS NULL OR @EventName) OR (EventName LIKE '%'+ @EventName +'%'))
...