Tsql 我可以在计算列select案例中抛出错误吗?

Tsql 我可以在计算列select案例中抛出错误吗?,tsql,calculated-columns,Tsql,Calculated Columns,我的计算列中有一个“case-when”,但我不知道如何抛出异常 下面是不起作用的示例代码 CREATE TABLE OrderDetail ( OrderID INT , ProductID INT , Qty INT , OrderDate DATETIME , ShipDate DATETIME , STATUS AS CASE WHEN shipdate is NULL AND orderdate < DATEADD( dd, -7, GETDATE()) THEN

我的计算列中有一个“case-when”,但我不知道如何抛出异常

下面是不起作用的示例代码

CREATE TABLE OrderDetail
( OrderID INT
, ProductID INT
, Qty INT
, OrderDate DATETIME
, ShipDate DATETIME
, STATUS AS CASE
       WHEN shipdate is NULL AND orderdate < DATEADD( dd, -7, GETDATE()) THEN 3
       WHEN shipdate is NOT NULL THEN 2
       ELSE RAISERROR ('Error in shipdate',-1,-1)
   end
 )
GO
创建表OrderDetail
(OrderID INT)
,ProductID INT
,数量整数
,OrderDate日期时间
,发货日期时间
,情况如何
当shipdate为NULL且orderdate
但它是无效的


难道不可能在计算列中引发错误吗?

这不能这样做。大小写表达式不能用作流控件。具体来说:

CASE表达式不能用于控制Transact-SQL语句、语句块、用户定义函数和存储过程的执行流

您可以向表中添加检查约束,但这不允许您提出自己的自定义错误:

CREATE TABLE OrderDetail
( 
      OrderID INT
    , ProductID INT
    , Qty INT
    , OrderDate DATETIME
    , ShipDate DATETIME
    , STATUS AS CASE
                    WHEN shipdate is NULL AND orderdate < DATEADD( dd, -7, GETDATE()) THEN 3
                    WHEN shipdate is NOT NULL THEN 2
                    ELSE NULL
                END
    , CONSTRAINT Chk_OrderDetails_Dates CHECK(
        shipdate IS NOT NULL 
        OR orderdate < DATEADD( dd, -7, GETDATE())
    )

)
GO
创建表OrderDetail
( 
OrderID INT
,ProductID INT
,数量整数
,OrderDate日期时间
,发货日期时间
,情况如何
当shipdate为NULL且orderdate
或者可以使用触发器(而不是插入和更新)来仅允许日期有效的行。
就个人而言,我会使用检查约束—它更安全,更易于编写和维护。

您不能从检查约束调用
RAISERROR
,但最接近您的想法可能是在插入/更新之前对该字段进行触发器检查,并在那里引发错误。