2009-05-02 7 views
2

同じ表の別の列の別の値と値をチェックするCHECK制約を実装する方法はありますか?具体的には、挿入する「チェックアウト」日付値が、行を挿入する前にテーブルの「checkin」日付値よりも大きいことを確認したいと思います。TSQL - 挿入する前に別の列の値に対して値をチェックする方法

詳細が不明な場合がありますので、ご連絡ください。

答えて

2

あなたが好きなチェックを使用できます。

:その後のような機能を追加し

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

これらは、書かれているようには機能しない可能性があります(現時点ではSQLエンジンにアクセスできません。)

または、チェックに失敗したときのコードでエラー処理を使用する必要がないように、そのチェックをクエリに含めることができます。

あなただけの句は何かのようであることをどこに拡張することができ失敗し、挿入したい場合は:あなたが好きなものを使用することができますいずれかの問題があったことを示すインジケータのいくつかのタイプを返すようにしたい場合は

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

拡張されたwhere句のためにupvoted!トリガーよりはるかに明白で、管理が容易です。 –

4

はい、MSSQLサーバー(およびその他)CHECK CONSTRAINTS on the tableを許可する - あなたが列を比較できるように:

ALTER TABLE tbl ADD CONSTRAINT chkCheckout_GT_Checkin 
    CHECK (Ckeckout > Checkin) 
0

トリガーを使用できます。

関連する問題