在where子句存储过程中处理null参数

时间:2014-03-21 07:09:15

标签: sql-server tsql

如果变量为null,并且如果它不为null,那么在sql中有更好的方法可以选择all吗?

示例:

CREATE PROCEDURE [dbo].[GetAllOrders]  
    @OrderNo varchar(50) =null
    AS

    IF @OrderNo IS NULL
        BEGIN   
            SELECT CustomerNo,Name,Surname,etc...
            FROM Customers 
        END
    ELSE
        BEGIN       
            SELECT CustomerNo,Name,Surname,etc...
            FROM Customers 
            WHERE OrderNo = @OrderNo
        END

尝试如下,但没有这样做 WHERE(OrderNo IS NULL或OrderNo = @OrderNo)

非常感谢

2 个答案:

答案 0 :(得分:2)

SELECT CustomerNo,Name,Surname,etc...
            FROM Customers 
            WHERE (OrderNo is null and 1=1)
                    Or
                    (OrderNo is not null and OrderNo = @OrderNo)

答案 1 :(得分:0)

您应该通过创建两个存储过程来简化SQL Server查询优化器的生命周期。一个取出全部,一个取OrderNo。这将使查询计划尽可能地适用于两种不同的方案。如果在参数为IF时创建计划,则在一个过程中使用NULL的版本可能会因OrderNo过滤查询的查询计划出现问题。

CREATE PROCEDURE [dbo].[GetOrdersByOrderNo]  
    @OrderNo varchar(50)
AS

SELECT CustomerNo,Name,Surname,etc...
FROM Customers 
WHERE OrderNo = @OrderNo

GO

CREATE PROCEDURE [dbo].[GetAllOrders]  
AS

SELECT CustomerNo,Name,Surname,etc...
FROM Customers 

如果由于某种原因需要客户端使用一个程序,则应该执行一个包装程序,然后调用上面的过程。

CREATE PROCEDURE [dbo].[GetOrders]  
    @OrderNo varchar(50)
AS

IF @OrderNo IS NULL 
  EXEC dbo.GetAllOrders
ELSE
  EXEC dbo.GetOrdersByOrderNo @OrderNo