Чтобы соответствовать DRY, одним из обходных путей может быть сохранение значений по умолчанию в таблице, возможно:
CREATE TABLE dbo.MyDefaults
(
OrderState INT
);
INSERT dbo.MyDefaults(OrderState) SELECT 0;
Вы не можете сделать это с помощью GETDATE (), поэтому давайте просто оставим все как есть - в любом случае, вы вряд ли что-то измените. Так что теперь мы можем извлечь наше значение по умолчанию из таблицы, а не жестко его кодировать. Давайте создадим скалярную функцию, потому что мы не можем использовать подзапрос в ограничении по умолчанию:
CREATE FUNCTION dbo.DefaultOrderState()
RETURNS INT
AS
BEGIN
RETURN (SELECT TOP (1) OrderState FROM dbo.MyDefaults);
END
GO
(Если у вас их много, вы можете рассмотреть подход EAV вместо выделенных столбцов.)
Так что теперь мы можем иметь нашу таблицу Orders и заметить, что константа "0" никогда не упоминается:
CREATE TABLE dbo.Orders
(
O_ID INT NOT NULL,
[State] INT NOT NULL DEFAULT (dbo.DefaultOrderState()),
P_ID INT,
OrderDate DATE NOT NULL DEFAULT (SYSDATETIME())
);
GO
И наша процедура обновления также может захватывать значения по умолчанию (за исключением того, что вы не определили, действительно ли вы хотите сбросить состояние на 0, если оно в данный момент не равно 0, и для процедуры не указано значение). Снова константа "0" не упоминается.
CREATE PROCEDURE dbo.UpdateOrder
@O_ID INT,
@State INT = NULL,
@P_ID INT,
@OrderDate DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.Orders
SET [State] = COALESCE(@State, dbo.DefaltOrderState()),
P_ID = @P_ID,
OrderDate = COALESCE(@OrderDate, OrderDate, SYSDATETIME())
WHERE
O_ID = @O_ID;
END
GO