TSQL - Как проверить значение против значения в другом столбце перед вставкой? - PullRequest
2 голосов
/ 02 мая 2009

Есть ли способ реализовать ограничение CHECK, которое сравнивает значение с другим значением в другом столбце в той же таблице? В частности, я хочу убедиться, что значение даты «извлечения» для вставки больше, чем значение даты «регистрации» в таблице перед вставкой строки.

Возможно, мне не хватает некоторых деталей, поэтому, пожалуйста, дайте мне знать, если это так.

Ответы [ 3 ]

4 голосов
/ 02 мая 2009

Да, MSSQL-сервер (и другие) разрешают ПРОВЕРИТЬ СООТВЕТСТВИЯ для таблицы - чтобы можно было сравнивать столбцы:

ALTER TABLE tbl ADD CONSTRAINT chkCheckout_GT_Checkin
    CHECK (Ckeckout > Checkin)
2 голосов
/ 02 мая 2009

Вы можете использовать чек как:

ALTER TABLE dbo.myTable ADD CONSTRAINT CK_myTable_CheckoutGreaterThanCheckin
CHECK (dbo.CheckDates()>1)

Затем добавьте функцию, например:

CREATE FUNCTION CheckDates()
RETURNS int
AS 
BEGIN
    DECLARE @retval int
    SET @retval = (SELECT COUNT(*) FROM myTable WHERE checkout > checkin)
    RETURN @retval
END;

Они могут работать не так, как написано (извините, в настоящее время у вас нет доступа к движку SQL).

Или, возможно, вы захотите включить проверку в запрос, чтобы вам не приходилось использовать обработку ошибок в своем коде, когда проверка не удалась.

Если вы просто хотите, чтобы вставка завершилась неудачно, вы можете расширить предложение where на что-то вроде:

INSERT INTO myTable (checkout) 
VALUES(@checkout) 
WHERE @checkout > @checkin AND IDcolumn = @IDcolumn

Если вы хотите вернуть какой-то индикатор того, что возникла проблема, вы можете либо использовать что-то вроде выше, но добавить SELECT @@ ROWCOUNT, либо вы можете просто проверить значение заранее:

DECLARE @var int
SET @var = (SELECT count(*)
FROM myTable
WHERE @checkout > checkin AND IDcolumn = @IDcolumn)

@ var будет равно 1, если передано значение.

0 голосов
/ 02 мая 2009

Вы можете попробовать использовать триггеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...