質問

同じテーブルの異なる列の別の値に対して値をチェックするCHECK制約を実装する方法はありますか?具体的には、「チェックアウト」が確実に行われるようにします。挿入される日付値が「チェックイン」よりも大きい行を挿入する前のテーブルの日付値。

詳細が不足している可能性がありますので、その場合はお知らせください。

役に立ちましたか?

解決

次のようなチェックを使用できます:

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になります。

他のヒント

はい、MSSQL Server(およびその他)はテーブルの制約を確認-列を比較できるようにする:

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

トリガーを使用してみることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top