2016-01-11 4 views
-1

У меня есть запрос sql, который я хочу запустить, и хочу что-то добавить к предложению where, если я пометить параметр как истинный. Я не думал, что мне нужно будет иметь одно и то же заявление sql дважды, но не могу найти способ сделать это. Это то, чего я хочу.Как добавить предложение Where в зависимости от значения параметра

DECLARE @getShipped VARCHAR = 'false'; 

SELECT DISTINCT 
    Serial_No 
INTO #Serials 
FROM Part_v_Container_Change2 AS CC 
WHERE Change_Date <= @dateEnding 
    *** AND IF @getShipped = 'true' THEN CC.Container_Status = 'Shipped' *** 

Пробовали ли утверждения и заявления о случаях, но не могут заставить это работать? Я просто не хочу повторять sql, если у меня его тоже нет.

+0

написать Динамический SQL – techspider

+0

Возможный дубликат [Необязательные аргументы в выражении WHERE] (http://stackoverflow.com/ questions/10185638/optional-arguments-in-where-clause) –

+0

Это не дубликат. Если вы читаете то, что вы предлагаете, они не покрывают ничего в отношении добавления дополнительного предложения where, основанного на логическом значении, заданном вами самим. Я думаю, что вы, возможно, не правильно прочитали мой вопрос и прыгнули с пистолета. – Danrex

ответ

4

Попробуй как этот

DECLARE @getShipped VARCHAR(20) = 'false'; 

SELECT DISTINCT 
    Serial_No 
INTO #Serials 
FROM Part_v_Container_Change2 AS CC 
WHERE Change_Date <= @dateEnding AND 
    ((@getShipped = 'true' AND CC.Container_Status = 'Shipped') OR @getShipped = 'false') 
+1

Отсутствие 'AND' после первой строки в предложении WHERE – AHiggins

+0

Спасибо @AHiggins, я обновил ответ. –

+0

Я, возможно, не объясняю себя должным образом. Когда я запускаю это, он возвращает null. Я хочу добавить «CC.Container_Status = отправлено» в предложение where, если значение @getShipped истинно, которое я буду добавлять к самому sql. – Danrex

0

Попробуйте динамический SQL-то вроде ниже

DECLARE @getShipped VARCHAR(20) = 'false'; 
DECLARE @sql NVARCHAR(255) = 'SELECT DISTINCT Serial_No INTO #Serials FROM Part_v_Container_Change2 AS CC 
WHERE Change_Date <= ''' + + CONVERT(VARCHAR, @dateEnding, 101) + '''' 

DECLARE @filter NVARCHAR(50) = ' AND CC.Container_Status = ''Shipped''' 

IF @getShipped = 'true' 
    SET @sql = @sql + @filter 

EXEC (@sql) 
+0

Это похоже на то, что мне нужно, но оно возвращает ошибку. Не удалось найти хранимую процедуру «S». – Danrex

+0

[Плохие привычки пинать: объявление VARCHAR без (длина)] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length .aspx) –

+0

Я отредактировал, чтобы объявить размер VARCHAR; можете ли вы попробовать распечатать @sql и посмотреть, что там? Мой код случайный, и вам может потребоваться надлежащим образом соединить значения – techspider

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