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)或其他东西。我不记得确切的语法,但读了有关合并函数的内容,你就会明白了。