私は、DBユーザーが2017-03-18
より大きな日付を入力することを許可しません。どのようにしてこの制約をテーブルに追加できますか? これが正しいですか?SQLの制約をチェックする
(Year([ContractEnd])<2017) and (Month([ContractEnd])<03) and (Day([ContractEnd])<18)
私は、DBユーザーが2017-03-18
より大きな日付を入力することを許可しません。どのようにしてこの制約をテーブルに追加できますか? これが正しいですか?SQLの制約をチェックする
(Year([ContractEnd])<2017) and (Month([ContractEnd])<03) and (Day([ContractEnd])<18)
あなたがそうのような既存のテーブルにそのような制約を追加することができます
[ContractEnd] DATE CHECK ([ContractEnd] <= '20170318')
あなたが言ったことを試しましたが、ここにエラーがあります:ALTER TABLEステートメントがCHECK制約 "CK_Professor"と競合しました。競合は、データベース "大学"、テーブル "dbo.Professor"、列 'ContractEnd'で発生しました。 – kwram
@kwramもちろんCK_Professorという名前の以前の制約を削除する必要があります。その後、 'alter table Professor add constraint 'を使用します。あなたはそれを削除する方法を知っていますか? – Marusyk
あなたは正しいですが、私はまだこの列に制約を設定していません!私はこの列に制約がありません。 – kwram
をお試しください:
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 */
データ型が 'datetime'または' datetime2'の場合、 'ContractEnd <'20170102'を使用して、' SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'CK_Professor ')およびparent_object_id = OBJECT_ID(N'Professor' 'が必要かもしれない。 –
@BaconBitsそれは本当です。 – SqlZim
どのようなタイプの ' ContractEnd'? 'DATETIME'? – Marusyk
いいえ、それは正しくありません。あなたのコードの値はあなたが述べた日付と一致しません。そして、チェックのような日付(時間)を分解する必要はありません。 –
列の種類は日付です。 – kwram