2016-12-02 4 views
2

Ниже приведена часть запроса SQL Server, который не работает должным образом. Я не знаю, почему, но условие проходит через эту часть, как ничто не вставлено (как и все три условия, установлены в NULL). Что я здесь делаю неправильно?Состояние SQL Server не работает

Входные параметры хранимой процедуры:

@cStockPacked varchar(1) = NULL, 
    @cWrittenDown varchar(1) = NULL, 
    @cInPreparation varchar(1) = NULL 

Часть запроса, который не работает:

( 
    (@cStockPacked IS NULL OR 
    (@cStockPacked = '1' AND MEST.MEST_STA = '1') 
    ) 
    OR 
    (@cInPreparation IS NULL OR 
    (@cInPreparation = '1' AND MEST.MEST_STA = '2') 
    ) 
    OR 
    (@cWrittenDown IS NULL OR 
    (@cWrittenDown = '1' AND MEST.MEST_STA = '4') 
    ) 
) 

Я пытался жестких условиях кода, все работало, как ожидалось:

(
    MEST.MEST_STA = '1' OR MEST.MEST_STA = '2' OR MEST.MEST_STA = '4' 
) 

Я пробовал с одним условием (hardcoded), затем с двумя, а затем со всеми тремя. Все было хорошо. Я хочу добиться того же результата с помощью вставленного выше вопроса, но что-то явно не так. Что я делаю не так?

Вся процедура:

ALTER PROCEDURE [dbo].[sp_CAMERC_HLP] 
    ( , @cStockPacked varchar(1) = NULL 
     , @cWrittenDown varchar(1) = NULL 
     , @cInPreparation varchar(1) = NULL 
    ) 
AS 
BEGIN 
    SELECT 
     MEST.MEST_QUA, MERC_STA, MERC_NME, 
     MERC_DES, MERC_NTO, MERC_UNI, MERC_LPR, 
     MERC.UNIT_KEY, 
     COUNT_ALL_ROWS = COUNT(*) OVER() 
    FROM 
     CAMERC MERC 
    INNER JOIN 
     CAMEGR CAMEGR ON MERC.MEGR_KEY = CAMEGR.MEGR_KEY 
    INNER JOIN 
     CAMEST MEST ON MERC.MERC_KEY = MEST.MERC_KEY 
    WHERE         
     (@cMERC_NME IS NULL OR MERC_NME LIKE '%' + @cMERC_NME + '%') 
     AND 
     (@iMEGR_KEY IS NULL OR MERC.MEGR_KEY IN (SELECT MEGR_KEY FROM CTE))   
     AND 
     (@cMERC_CDO1 IS NULL OR MERC_CDO1 LIKE '%' + @cMERC_CDO1 + '%') 
     AND  
     and 
     ( 
      (@cStockPacked IS NULL OR @cStockPacked = '1' AND MEST.MEST_STA = '1') 
      OR 
      (@cInPreparation IS NULL OR (@cInPreparation = '1' AND MEST.MEST_STA = '2')) 
      OR 
      (@cWrittenDown IS NULL OR (@cWrittenDown = '1' AND MEST.MEST_STA = '4'))     
     ) 
END 
+0

Думайте, что вам нужно будет показать больше запросов, чем это, людям понадобится контекст, чтобы понять, в чем проблема. Например, как определяется @cStockPacked – Flexicoder

+0

Я не совсем понимаю вопрос. Код, который «не работает», реализует другую логику из кода, который «работает». Я не удивлен, что разная логика дает разные результаты. –

+0

Почему другая логика? Я просто жестко определил, что я хотел бы выйти из условия. – FrenkyB

ответ

3

Вы можете искать эту

(
    ( 
    (@cStockPacked IS NOT NULL AND @cStockPacked = '1' AND MEST.MEST_STA = '1') OR 
    (@cInPreparation IS NOT NULL AND @cInPreparation = '1' AND MEST.MEST_STA = '2') OR 
    (@cWrittenDown IS NOT NULL AND @cWrittenDown = '1' AND MEST.MEST_STA = '4')  
) 
    OR 
    (@cStockPacked IS NULL OR @cInPreparation IS NULL OR @cWrittenDown IS NULL) 
) 
+0

Вот и все :) Большое спасибо. – FrenkyB

+0

Существует проблема - если я не устанавливаю ни одно из этих условий, ничего не появляется. Я не получаю никаких результатов. – FrenkyB

+0

Обновлено Ans. Убедитесь, что вы должны использовать точную скобку, как она используется в Ans –

0

Я не понимаю, почему вы приняли этот ответ, как правильно, это не имеет особого смысла, чтобы проверить вар для NULL с этими условиями.

Все, что вам нужно - сделать эти условия такими же, как другие. Так же, как это:

AND (@cMERC_NME IS NULL OR MERC_NME LIKE '%' + @cMERC_NME + '%') 

обновить их:

AND (@cStockPacked IS NULL OR (@cStockPacked = '1' AND MEST.MEST_STA = '1')) 
    AND (@cInPreparation IS NULL OR (@cInPreparation = '1' AND MEST.MEST_STA = '2')) 
    AND (@cWrittenDown IS NULL OR (@cWrittenDown = '1' AND MEST.MEST_STA = '4'))  

это все.

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