Так нельзя сделать.Выражение регистра не может использоваться в качестве элемента управления потоком.В частности, задокументировано :
Выражение 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
Или вы можете использовать триггеры - вместо вставки ивместо обновления, чтобы разрешить только строки, где даты являются действительными.Лично я бы пошел с проверочным ограничением - это безопаснее и легче писать и поддерживать.