2015-09-13 5 views
-1

Если orderid is not null то в SQL запросе я хочу добавитьхранимой процедуры SQL Server Dynamic, когда условие

and SODtl.OrderID = @OrderID. 

У меня есть использовать 2 запросов на выборку. Я хочу только одно заявление о выборе

ALTER PROCEDURE [dbo].[SOReg_Select] 
      @OrderID int=null, 
      @From date =null, 
      @To date=null 
AS 
begin 
    if @OrderID is null 
    begin 
     SELECT  
      SODtl.OrderID, SODtl.OrderLine, Products.ProductName, 
      SODtl.Style, SODtl.Width, SODtl.Size, Color.Color, 
      SODtl.Quantity, Uom.Name, SODtl.Rate, SODtl.Amount, 
      SODtl.BalQty, SODtl.Remark, SOHdr.OrderDate, 
      Customers.ContactName, SOHdr.RefNo, SOHdr.RefDate, 
      SOHdr.Payment, SOHdr.Terms, SOHdr.Remarks 
     FROM   
      Products 
     RIGHT OUTER JOIN 
      SODtl 
     LEFT OUTER JOIN 
      Uom ON SODtl.UomID = Uom.UomID 
     LEFT OUTER JOIN 
      Color ON SODtl.ColorID = Color.ColorID ON Products.ProductID = SODtl.ProductID 
     LEFT OUTER JOIN 
      Customers 
     RIGHT OUTER JOIN 
      SOHdr ON Customers.CustomerID = SOHdr.CustomerID ON SODtl.OrderID = SOHdr.OrderID 
     WHERE 
      OrderDate BETWEEN @From AND @To        
    end   
    else 
    begin 
     SELECT  
      SODtl.OrderID, SODtl.OrderLine, Products.ProductName, 
      SODtl.Style, SODtl.Width, SODtl.Size, Color.Color, 
      SODtl.Quantity, Uom.Name, SODtl.Rate, SODtl.Amount, 
      SODtl.BalQty, SODtl.Remark, SOHdr.OrderDate, 
      Customers.ContactName, SOHdr.RefNo, SOHdr.RefDate, 
      SOHdr.Payment, SOHdr.Terms, SOHdr.Remarks 
     FROM   
      Products 
     RIGHT OUTER JOIN 
      SODtl 
     LEFT OUTER JOIN 
      Uom ON SODtl.UomID = Uom.UomID 
     LEFT OUTER JOIN 
      Color ON SODtl.ColorID = Color.ColorID ON Products.ProductID = SODtl.ProductID 
     LEFT OUTER JOIN 
      Customers 
     RIGHT OUTER JOIN 
      SOHdr ON Customers.CustomerID = SOHdr.CustomerID ON SODtl.OrderID = SOHdr.OrderID 
     WHERE 
      OrderDate BETWEEN @From AND @To 
      AND SODtl.OrderID = @OrderID 
    end 
end 

Это то, что я сделал. Я хочу, чтобы запрос, чтобы упростить и не хочет повторения оператора выбора

+1

Смешивание ЛЕВЫЙ JOINS с ПРАВЕ JOINS, как ... с ума! Btw, в какую таблицу входит столбец OrderDate? – jarlh

+0

Используйте функцию COALESCE для 'If not null, затем получите значение' части запроса. это что-то вроде OrderID = Coalesce (@OrderID, OrderID) или что-то в этом роде. Я не помню точного синтаксиса, но читал о функции Coalesce, и вы получите эту идею. –

ответ

0

попробовать это,

SELECT SODtl.OrderID, 
     SODtl.OrderLine, 
     Products.ProductName, 
     SODtl.Style, 
     SODtl.Width, 
     SODtl.Size, 
     Color.Color, 
     SODtl.Quantity, 
     Uom.Name, 
     SODtl.Rate, 
     SODtl.Amount, 
     SODtl.BalQty, 
     SODtl.Remark, 
     SOHdr.OrderDate, 
     Customers.ContactName, 
     SOHdr.RefNo, 
     SOHdr.RefDate, 
     SOHdr.Payment, 
     SOHdr.Terms, 
     SOHdr.Remarks 
FROM Products 
RIGHT OUTER JOIN SODtl 
LEFT OUTER JOIN Uom ON SODtl.UomID = Uom.UomID 
LEFT OUTER JOIN Color ON SODtl.ColorID = Color.ColorID ON Products.ProductID = SODtl.ProductID 
LEFT OUTER JOIN Customers 
RIGHT OUTER JOIN SOHdr ON Customers.CustomerID = SOHdr.CustomerID ON SODtl.OrderID = SOHdr.OrderID 
WHERE OrderDate BETWEEN @From AND @To 
    AND (([email protected]) 
     OR (@OrderID IS NULL)) 
0

Вы можете использовать ISNULL:

SELECT 
    /* Columns */ 
FROM Products 
    /* Joins */ 
WHERE OrderDate BETWEEN @From AND @To 
    AND SODtl.OrderID = ISNULL(@OrderID, SODtl.OrderID); 

И вы можете удалить из кода IF THEN ELSE.

Опционально вы можете изменить ISNULL на COALESCE или CASE WHEN или OR заявление для создания не менее 4 возможных решений.

+1

благодаря этому решению отлично работает – user2944912

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