如果变量为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)
非常感谢答案 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