필터링 된 인덱스 제한을 해결하는 한 가지 방법은 인덱스 된 뷰를 사용하는 것입니다.
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
편집하다:
인덱스에 두 개의 열이있는 경우 뷰를 어떻게 정의해야합니까? Table01 (column01, column02)에서 UNIQUE INDEX UIX_01 만들기 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