2017-06-13 6 views
0

私は、DBユーザーが2017-03-18より大きな日付を入力することを許可しません。どのようにしてこの制約をテーブルに追加できますか? これが正しいですか?SQLの制約をチェックする

(Year([ContractEnd])<2017) and (Month([ContractEnd])<03) and (Day([ContractEnd])<18) 
+0

どのようなタイプの ' ContractEnd'? 'DATETIME'? – Marusyk

+0

いいえ、それは正しくありません。あなたのコードの値はあなたが述べた日付と一致しません。そして、チェックのような日付(時間)を分解する必要はありません。 –

+0

列の種類は日付です。 – kwram

答えて

0

あなたがそうのような既存のテーブルにそのような制約を追加することができます

[ContractEnd] DATE CHECK ([ContractEnd] <= '20170318') 
+0

あなたが言ったことを試しましたが、ここにエラーがあります:ALTER TABLEステートメントがCHECK制約 "CK_Professor"と競合しました。競合は、データベース "大学"、テーブル "dbo.Professor"、列 'ContractEnd'で発生しました。 – kwram

+0

@kwramもちろんCK_Professorという名前の以前の制約を削除する必要があります。その後、 'alter table Professor add constraint 'を使用します。あなたはそれを削除する方法を知っていますか? – Marusyk

+0

あなたは正しいですが、私はまだこの列に制約を設定していません!私はこの列に制約がありません。 – kwram

3

をお試しください:

alter table t add constraint chk_ContractEnd_lt_20170319 
    check (ContractEnd<'20170319'); 

rextesterデモ:http://rextester.com/FQWFMI88817

create table t (
    id int not null identity(1,1) 
    , ContractEnd date 
    /* at table creation */ 
    , constraint chk_ContractEnd_lt_20170319 check (ContractEnd<'20170319') 
) 
alter table t drop constraint chk_ContractEnd_lt_20170319; 
/* to existing table */ 
alter table t add constraint chk_ContractEnd_lt_20170319 
    check (ContractEnd<='20170318'); 


insert into t values ('20161231') 
insert into t values ('20170318') 
/* all good */ 

insert into t values ('20170319') 
/* -- Error, constraint violation */ 
+0

データ型が 'datetime'または' datetime2'の場合、 'ContractEnd <'20170102'を使用して、' SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'CK_Professor ')およびparent_object_id = OBJECT_ID(N'Professor' 'が必要かもしれない。 –

+0

@BaconBitsそれは本当です。 – SqlZim