Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 无论如何都要避免if-else分支中的重复代码_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 无论如何都要避免if-else分支中的重复代码

Sql server 2008 无论如何都要避免if-else分支中的重复代码,sql-server-2008,tsql,Sql Server 2008,Tsql,这是表格和数据 CREATE TABLE #Customers ( ID INT NOT NULL, ProductID INT NOT NULL, OrderID INT NULL ) INSERT INTO #Customers VALUES (1,10,1) INSERT INTO #Customers VALUES (2,10,NULL) INSERT INTO #Customers VALUES (3,10

这是表格和数据

CREATE TABLE #Customers
(
    ID              INT NOT NULL,
    ProductID       INT NOT NULL,
    OrderID         INT NULL
)

INSERT INTO #Customers VALUES (1,10,1)
INSERT INTO #Customers VALUES (2,10,NULL)
INSERT INTO #Customers VALUES (3,10,5)
INSERT INTO #Customers VALUES (4,20,NULL)
INSERT INTO #Customers VALUES (5,20,NULL)
INSERT INTO #Customers VALUES (6,20,22)
GO
我有一个存储过程,其中结果的决定基于参数@OrderID。如果@OrderID不为null,则返回与此参数匹配的行,否则返回所有行。大致如下

DECLARE @OrderID INT 
SET @OrderID = NULL

IF @OrderID IS NULL 
BEGIN
    SELECT * FROM #Customers
END
ELSE
BEGIN
    SELECT * FROM #Customers
    WHERE OrderID = @OrderID 
END
我只是想知道是否有必要写一个WHERE子句来涵盖这两种情况。这样可以避免IF-ELSE分支中的代码重复

您可以将其编写为

        SELECT * FROM #Customers
WHERE (OrderID = @OrderID  or @OrderID is Null)

如果变量@ORderId为NULL,则所有行都将返回。如果不为空,则会触发过滤器的后半部分。

1=1在这里似乎不必要。使用它的任何特殊原因我都是出于习惯,这样在设计查询时可以更轻松地更改where过滤器。它是完全可选的,不影响任何东西来保持它在里面或外面(除了我的理智)。
DECLARE @OrderId INT = NULL

SELECT * 
FROM #Customers c
WHERE 1=1
AND (@OrderId IS NULL OR c.OrderId = @OrderId)