Могу ли я выдать ошибку в случае выбора вычисляемого столбца? - PullRequest
0 голосов
/ 24 сентября 2019

В моем вычисляемом столбце есть «случай, когда», но я не могу понять, как вызвать исключение.

Вот пример кода, который не работает ...

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

Но это неверно.

Не возможно ли вызвать ошибку в вычисляемых столбцах?

1 Ответ

0 голосов
/ 24 сентября 2019

Так нельзя сделать.Выражение регистра не может использоваться в качестве элемента управления потоком.В частности, задокументировано :

Выражение 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

Или вы можете использовать триггеры - вместо вставки ивместо обновления, чтобы разрешить только строки, где даты являются действительными.Лично я бы пошел с проверочным ограничением - это безопаснее и легче писать и поддерживать.

...