Если у вас есть побитовое перечисление с 10 номерами, то они будут иметь значения от 1 до 512, при степенях 2. Таким образом, диапазон может быть от 0 до 1023. Добавление ограничения, как это:
CREATE TABLE sample
(
id INT PRIMARY KEY,
flags INT,
CONSTRAINT chk_flgs CHECK (flags BETWEEN 0 and 1023)
)
Однако я бы настоятельно предостерег от этого. Реляционные базы данных предназначены для доступа к данным по-разному и легко выполняются запросы к данным. Побитовые операторы неэффективны в SQL. Подумайте о ситуации, когда вы хотите перечислить все соответствующие флаги? Было бы более нормализованным создание таблицы поиска с перечисляемыми значениями и добавление таблицы перекрестных ссылок между вашим источником и поисковой таблицей.
Приведенный выше пример стал бы это:
CREATE TABLE Flags
(
FlagID INT PRIMARY KEY, -- When inserted, match enum value
FlagName nvarchar(50)
);
CREATE TABLE SampleS
(
SampleID INT PRIMARY KEY
);
CREATE TABLE Xref_Sample_Flags
(
SampleID INT,
FlagID INT,
CONSTRAINT FK_SampleID FOREIGN KEY (SampleID) REFERENCES Sample (SampleID),
CONSTRAINT FK_FlagID FOREIGN KEY (FlagID) REFERENCES Flags (FlagID)
);
Больше столов, но в долгосрочной перспективе легче поддерживать и запросы.
Отличное решение, спасибо. Unfornatelly, мой код уже реализован, и мне нужно переместить в DB эти значения. –
«мой код уже реализован» - это не всегда является достаточным условием. Иногда большее изменение теперь может сэкономить вам скорбь по трассе ... –