Перечислимые типы в SQL Server 2008? - PullRequest
6 голосов
/ 03 марта 2010

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

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

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

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

  1. 1018 * Скачивали *
  2. Удалено
  3. Обновлено
  4. инициализирован

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

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

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

Ответы [ 3 ]

10 голосов
/ 03 марта 2010

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

6 голосов
/ 22 мая 2012

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

CREATE TABLE my_table ( 
    UpdateStatus VARCHAR2(11) 
      CHECK( UpdateStatus IN ('Downloaded', 'Deleted', 'Updated', 'Initialized'))
)
1 голос
/ 21 мая 2012

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

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

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

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

...