0

テーブルを持つ:Table1列が null 許容値を受け入れる場合、最大 2 回複製できるCodeコードで始まるコードを除いて、値が null 非許容値に対して一意であることをどのように保証できますか?'A'

表1

Id |  Code
---------- 
1  |  NULL   --[ok]
2  |  A123   --[ok]
3  |  A123   --[ok]
4  |  B100   --[ok] 
5  |  C200   --[ok]
6  |  B100   --[not ok already used]
7  |  NULL   --[ok]

私が試したのは、インデックス付きビューを作成することです。ソリューションはNULL値に対しては正常に機能しますが、私が言及した2番目のケースでは機能しません(実際にはスキップされました)

Create view v_Table_unq with schemabinding as( 
         select code from 
         dbo.Table1 
         where code is not null and code not like 'A%'
)
go
create unique clustered index unq_code on v_Table_unq(code)

手伝ってくれてありがとう

4

2 に答える 2

2

テーブルの作成

CREATE TABLE CheckConstraint
(
  Name VARCHAR(50),
)
GO

関数の作成

create FUNCTION CheckDuplicateWithA() RETURNS INT AS BEGIN

  DECLARE @ret INT  =0 ;
  SELECT @ret = IsNull(COUNT(Name), 0) FROM CheckConstraint WHERE Name like '[A]%' group by Name having COUNT(name) >= 1;
  RETURN IsNUll(@ret, 0);
END;

GO

create FUNCTION CheckDuplicateOtherThenA() RETURNS INT AS BEGIN

  DECLARE @ret INT  =0 ;
  SELECT @ret = IsNull(COUNT(Name), 0) FROM CheckConstraint WHERE Name not like '[A]%' group by Name having COUNT(name) >= 1;
  RETURN IsNUll(@ret, 0);
END;

GO

制約

alter TABLE CheckConstraint
  add CONSTRAINT CheckDuplicateContraintWithA CHECK (NOT (dbo.CheckDuplicateWithA() > 2));
go

alter TABLE CheckConstraint
  add CONSTRAINT CheckDuplicateConmstraintOtherThenA CHECK (NOT (dbo.CheckDuplicateOtherThenA() > 1));
go

結果セット

insert into CheckConstraint(Name)Values('b')  -- Passed
insert into CheckConstraint(Name)Values('b')  -- Failed

insert into CheckConstraint(Name)Values('a')  -- Passed
insert into CheckConstraint(Name)Values('a')  -- Passed
insert into CheckConstraint(Name)Values('a')  -- Failed
于 2012-07-16T18:54:07.103 に答える
-1

なぜ一意の制約が必要なのですか? テーブルにデータを挿入する proc にこのロジックを追加できない理由それはうまくいき、適切なエラーメッセージを返す可能性があります.これは、オーバーヘッドに追加されるインデックスビューを持つよりもオーバーヘッドが少なくなります.「A」で始まらないレコードに一意の制約が必要な場合は、永続化された列を持ち、その上で一意の制約。

もちろん、インデックス付きの計算列を永続化するオーバーヘッドがあります。ただし、一意の制約が必要な場合は、それを使用できます。「A」で始まる値の場合、これは null 値になる可能性があります。

于 2012-07-16T11:52:15.493 に答える