フィルター選択されたインデックスの制限を回避する1つの方法は、インデックス付きビューを使用することです。
CREATE TABLE dbo.Table01 (
Column01 NVARCHAR(100)
);
GO
CREATE VIEW dbo.vw_Table01_Column01_LenOver5Unique
WITH SCHEMABINDING AS
SELECT Column01
FROM dbo.Table01
WHERE LEN(Column01) >= 5;
GO
CREATE UNIQUE CLUSTERED INDEX cdx
ON dbo.vw_Table01_Column01_LenOver5Unique(Column01);
GO
INSERT INTO dbo.Table01 VALUES('1'); --success
INSERT INTO dbo.Table01 VALUES('1'); --success
INSERT INTO dbo.Table01 VALUES('55555'); --success
INSERT INTO dbo.Table01 VALUES('55555'); --duplicate key error
GO
編集:
インデックスに2つの列がある場合、どのようにビューを定義する必要がありますか?CREATE UNIQUE INDEX UIX_01 ON Table01(column01、column02)WHERE LEN(column01)> = 5
インデックス付きビューのアプローチは、他のキー列をビュー定義とインデックスに追加することにより、複合キーに拡張できます。ビュー定義にも同じフィルターが適用されますが、修飾する行の一意性は単一の列値ではなく複合キーによって強制されます。
CREATE TABLE dbo.Table01 (
Column01 NVARCHAR(100)
,Column02 NVARCHAR(100)
);
GO
CREATE VIEW dbo.vw_Table01_Column01_LenOver5Unique
WITH SCHEMABINDING AS
SELECT Column01, Column02
FROM dbo.Table01
WHERE LEN(Column01) >= 5;
GO
CREATE UNIQUE CLUSTERED INDEX cdx
ON dbo.vw_Table01_Column01_LenOver5Unique(Column01, Column02)
GO
INSERT INTO dbo.Table01 VALUES('1','A'); --success
INSERT INTO dbo.Table01 VALUES('1','A'); --success
INSERT INTO dbo.Table01 VALUES('55555','A'); --success
INSERT INTO dbo.Table01 VALUES('55555','B'); --success
INSERT INTO dbo.Table01 VALUES('55555','B'); --duplicate key error
GO