2015-05-25 4 views
4

В настоящее время я выполняю переход от MS Access к SQL Server. Поскольку Access позволяет несколько Nulls на уникальных индексах, где, как не работает SQL Server ... Я обрабатывал миграцию, удаляя индексы в SQL Server и добавляя отфильтрованные индексы: CREATE UNIQUE NONCLUSTERED INDEX idx_col1_notnull ON tblEmployee(col1) WHERE col1 IS NOT NULL;Уникальная константа TSQL Multi Column, которая также допускает множественные нули

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как реализовать составные или многоколонные «фильтрованные» индексы ... или если это действительно возможно, так как я не нашел примеров для его исследования.

У меня есть идея реализовать путем создания отфильтрованных индексов, как так:

CREATE UNIQUE NONCLUSTERED INDEX idx_col1col2_notnull ON tblEmployee(col1,col2) WHERE col1 IS NOT NULL 

А затем добавить второй отфильтрованный индекс:

CREATE UNIQUE NONCLUSTERED INDEX idx_col2col1_notnull ON tblEmployee(col1,col2) WHERE col2 IS NOT NULL 

Но я не уверен, если это будет даже работа не говоря уже о лучшем методе. Было бы высоко оценено руководство в правильном направлении.

+2

Рассматривали ли вы с помощью проверочных ограничений? По крайней мере, вам не нужно будет иметь несколько индексов в таблице. –

+0

@JamesZ. Я знаком с использованием контрольных ограничений в контексте их включения и выключения для целей миграции ... поэтому я буду исследовать его. Спасибо ... –

+0

Исправьте его в дизайне данных. Создайте таблицу FK, которая не допускает null. Затем просто создайте представление с левым соединением, чтобы представить нуль. – Paparazzi

ответ

6

Вы можете добавить следующий индекс индексировать только не являющийся обнуляемый колонок:

create table tblEmployee(col1 int, col2 int) 
go 

create unique nonclustered index idx_col1col2_notnull ON tblEmployee(col1,col2) 
where col1 is not null and col2 is not null 
go 

--This Insert successeds 
insert into tblEmployee values 
(null, null), 
(null, null), 
(1, null), 
(1, null), 
(null, 2), 
(null, 2) 

--This Insert fails 
insert into tblEmployee values 
(3, 4), 
(3, 4) 
Смежные вопросы