SQL Server存储过程动态where条件

SQL Server存储过程动态where条件,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,如果orderid不为空,那么在SQL查询中我想附加 and SODtl.OrderID = @OrderID. 我使用了两个select查询。我只需要一个select语句 ALTER PROCEDURE [dbo].[SOReg_Select] @OrderID int=null, @From date =null, @To date=null AS begin if @OrderID is null

如果
orderid不为空
,那么在SQL查询中我想附加

and SODtl.OrderID = @OrderID.
我使用了两个select查询。我只需要一个select语句

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

这就是我所做的。我希望查询简化,不希望重复select语句

您可以使用
ISNULL

SELECT 
  /* Columns */
FROM Products 
  /* Joins */
WHERE OrderDate BETWEEN @From AND @To
  AND SODtl.OrderID = ISNULL(@OrderID, SODtl.OrderID);
您可以从代码中删除
IF-THEN-ELSE

可选地,当或或语句生成至少4种可能的解决方案时,您可以将
ISNULL
更改为
合并
CASE

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)
       OR (@OrderID IS NULL))

像这样混合左连接和右连接。。。疯子顺便说一句,OrderDate列属于哪个表?对查询的“如果不为null,则获取值”部分使用合并函数。它类似于OrderID=Coalesce(@OrderID,OrderID)或其他东西。我不记得确切的语法,但读了有关合并函数的内容,你就会明白了。