2015-02-27 3 views
0

Я пытаюсь сделать что-то, но я застрял в проблеме. Проблема в том, что мне нужно создать хранимая процедура, если парам процедуры является фактической датой или старше, 2 параметра в запросе и часть того, где будут игнорироваться. Сначала я использую if else, чтобы игнорировать случаи, но код повторяется и несовместим для поддержания. Поэтому мне нужно сделать то же самое, но без инструкции if/else. любая помощь будет оценена.Проблема с заявлением на крест и от

select 
       Cats.*, 
       Zone.[D] as [De], -- this part would be avoided if @Min and @Max are null 
       Zone.[R] as [Re] -- this part would be avoided if @Min and @Max are null 
      from 
       flv 
       CROSS APPLY --all the cross apply would be avoided if @Min and @Max are null 
        (
         select 
          x 
         from 
          XXXX 
         where 
          XXXX.IDx= 1 
        ) as Data 
where   
        ---where clause 

Я просто хочу, чтобы избежать перекрестного применять в случае, когда 2 Титулы являются нуль

+0

Ваш запрос не имеет смысла. Что такое «Кошки»? Что такое «Зона»? «Cross apply» ничего не делает, кроме, возможно, фильтрации всех строк. –

+0

@ Gordon Linoff Идея заключается в том, как я могу избежать определения двух элементов в selet и cross apply, если 2 params равны нулю. Код - пример. извините, если у вас нет никакого смысла – ArlanG

ответ

0

Изменение XXXX.IDx= 1 в @Min IS NOT NULL AND @Max IS NOT NULL AND XXXX.IDx= 1 и ваш крест применять не повредит немного. Однако это означает, что никакие строки не будут возвращены из CROSS APPLY и, следовательно, весь запрос. Таким образом, вы будете нуждаться в ALS CROSS APPLY в OUTER APPLY

Например следующий сценарий:

DECLARE @test INT 
SELECT * FROM dbo.tmpTable AS TT 
    OUTER APPLY (
     SELECT * FROM dbo.test AS T 
     WHERE @test IS NOT NULL 
    ) AS T 

дает следующий план выполнения, обратить особое внимание на компонент фильтра здесь.

enter image description here

При наведении компонент фильтра вы можете заметить следующее

enter image description here

Значение dbo.test в этом случае будет сканироваться только если предикат запуска выполняется. Положите OPTION (RECOMPILE) на запрос и посмотрите фактический план запроса, а таблица даже не указана в плане запроса, если @test имеет значение null.

enter image description here

+0

mmm @MWillemse, не работайте для меня, когда я помещаю его, запрос не дает мне никаких значений, я искал поиск ... – ArlanG

+0

Изменено ваше 'CROSS APPLY' в «ВНУТРЕННЕЕ ПРИМЕНЕНИЕ»? – MWillemse

+0

Я изменил, но теперь все время мимо внешнего применяют, возвращают мне те же результаты – ArlanG

Смежные вопросы