1

SQL Server 2008 にチェック制約を追加しようとしています。このコードを実行すると、次のエラーが発生します。

alter table db.dbo.myTable add constraint
noWWWifProgramIsKnown check
(dbo.checkcountuniversalservice(A, B,
C)=0 and  program='WWW' )

エラーが発生します:

ALTER TABLE ステートメントが CHECK 制約 "noWWWifProgramIsKnown" と競合しました。データベース「db」、テーブル「dbo.tableuniversalservice」で競合が発生しました。

SO に関する Marc_s の回答によると、これは b/c 一部の行が制約に違反している可能性が高い: ALTER TABLE ステートメントが競合している

ただし、これは 0 を返すため、制約に違反する行はありません。

select COUNT(*) from db.dbo.tableuniversalservice 
where
(dbo.checkcountuniversalservice(A, B, C)=0
and 
program='WWW'
)

私は何が欠けていますか?

4

1 に答える 1

3

あなたのチェックは逆だと思います...制約が合格するためには、TRUEまたはに評価する必要がありUNKNOWNます。ステートメントSELECTは、制約に違反する行がないことを伝えるのではなく、制約を満たす行がないことを伝えています。

MSDN から:

CHECK 制約は、FALSE と評価される値を拒否します。

于 2012-12-07T23:00:06.487 に答える