TSQL-挿入する前に別の列の値に対して値をチェックする方法
-
03-07-2019 - |
質問
同じテーブルの異なる列の別の値に対して値をチェックする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)
トリガーを使用してみることができます。
所属していません StackOverflow