6

Есть ли какой-то механизм в SQL Server, чтобы позволить функции типа Enumerated типа?Перечисленные типы в SQL Server 2008?

Например, если у меня есть столбец "UpdateStatus" он обычно получает установку с одиночными значениями буквенных следующим образом:

  1. D
  2. X
  3. U
  4. I

Это может приравниваться ко многим вещам. Это приводит к путанице. Альтернативой является то столбец строка, как это:

  1. Скачано
  2. Удаляется
  3. Обновлено
  4. Initialized

Но это имеет свои собственные проблемы. В конце концов кто-то собирается написать что-то вроде этого: where UpdateStatus = 'Initalized' (написано неправильно). Плюс я слышу, что отключение строк - это не все, что исполняет.

Итак, есть ли какой-либо перечислимый тип для SQL Server, который может помочь в этом? В основном я ищу время компиляции, проверяя, что сравниваемое значение (т.е. «Инициализировано») является частью списка значений.

Я использую SQL Server 2008.

+0

Нет, другие, что предлагаемые решения (таблица поиска с ограничением FK), в SQL Server ничего не работает, как тип «enum». –

+0

@marc_s: Это слишком плохо. Я надеялся, что некоторые объекты объектов CLR могут быть использованы для создания перечисляемого типа. – Vaccano

ответ

10

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

+1

@Philip Fourie: Я могу это сделать (и у меня есть такой материал в db уже) Но что я ищу [is] ** время компиляции **, проверяя, что сравниваемое значение (т.е. «Инициализировано») является частью списка ценностей ». Предлагает ли это решение проводить проверку времени компиляции? – Vaccano

+2

@ Vaccano: нет, но он обеспечивает защиту от аномалий изменения данных. Тем не менее, вы просто настроили соответствующее перечисление, если это важная и перекрестная проверка при запуске приложения. И +1. – gbn

+0

@ Vaccano, извините, не понял * время компиляции * проверка была важна, когда я ответил. Извините, я не знаю, как лучше это сделать, чем упоминалось здесь. –

1

Единственный способ, которым я это видел, - использовать UDF для оценки того, действительно ли строковое представление перечисления. Это медленно, это болезненно и обычно не стоит того, но по крайней мере у вас есть способ провалиться громко, а не тихо.

И помните, что вы не можете RAISERROR в UDF, так что вы должны вызвать причину возникновения ошибки и записать журнал отдельно.

В конечном счете, «идеальное» решение проблемы должно заключаться в том, чтобы приблизиться с другой стороны - вы можете достичь этого менталитета с помощью ORM с первым кодом, который позволит вам использовать собственные перечисления в вашем код и соответствующие SQL-запросы будут правильно созданы при миграции.

Вот в надежде мы получаем перечисления в ближайшее время, we're feeling a little left out.

6

Кроме таблицы поиска (ФКС), в простых случаях можно использовать проверочные ограничения:

CREATE TABLE my_table ( 
    UpdateStatus VARCHAR2(11) 
     CHECK(UpdateStatus IN ('Downloaded', 'Deleted', 'Updated', 'Initialized')) 
)