6

Czy jest jakiś mechanizm w SQL Server, aby umożliwić funkcjonalność typu wyliczonego?Wyliczone typy w SQL Server 2008?

Na przykład, jeśli mam kolumnę o nazwie "UpdateStatus" to zwykle dostaje konfigurację z pojedynczych wartości liter tak:

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

To może równać się wielu rzeczom. To prowadzi do zamieszania. Alternatywą jest, aby mieć to być kolumna ciąg tak:

  1. pobranych
  2. Usunięto
  3. Updated
  4. przygotowanej

Ale to ma swoje własne problemy. W końcu ktoś napisze coś takiego: where UpdateStatus = 'Initalized' (błędnie napisane). Poza tym słyszę, że wyłączanie ciągów nie jest tak skuteczne.

Czy istnieje jakiś typ wyliczeniowy dla programu SQL Server, który może w tym pomóc? Zasadniczo szukam czasu kompilacji sprawdzanie, czy porównywana wartość (np. "Initialized") jest częścią listy wartości.

Używam SQL Server 2008.

+0

Nie, inny, że proponowane rozwiązania (tabela przeglądowa z ograniczeniem FK) nie ma nic w SQL Server, który działa jak typ "enum". –

+0

@marc_s: To źle. Miałem nadzieję, że niektóre obiekty CLR mogą zostać użyte do stworzenia wyliczonego typu. – Vaccano

Odpowiedz

10

Dlaczego nie mieć tablicę przeglądową, która zawiera kod i opis. Utworzenie klucza obcego do tej tabeli odnośników spowoduje, że zostaną użyte tylko poprawne kody.

+1

@Philip Fourie: Mogę to zrobić (i mam już takie rzeczy w db) Ale co "szukam [jest] ** czas kompilacji ** sprawdzanie, czy porównywana wartość (np." Inicjalizacja ") jest częścią listy wartości. " Czy to rozwiązanie umożliwia sprawdzanie czasu kompilacji? – Vaccano

+2

@Vaccano: nie, ale oferuje ochronę przed anomaliami modyfikacji danych. Jednak wystarczy skonfigurować listę wyliczeń, jeśli jest to ważne i sprawdzić poprawność uruchamiania aplikacji. I +1. – gbn

+0

@Vaccano, przepraszam, nie zdawałem sobie sprawy * czas kompilacji * sprawdzanie było ważne, gdy odpowiadałem. Przepraszam, że nie znam lepszego sposobu, niż wspomniano tutaj. –

1

Jedynym sposobem, w jaki to widziałem, jest użycie UDF do oceny, czy reprezentacja ciągu enum jest poprawna. Jest powolny, jest bolesny i zazwyczaj nie warty, ale przynajmniej masz sposób, aby nie mówić głośno, zamiast po cichu.

Pamiętaj, że nie możesz RAISERROR w UDF, więc musisz spowodować celowe spowodowanie błędu i zalogować się osobno.

Ostatecznie "idealnym" rozwiązaniem problemu byłoby podejście z drugiej strony - można osiągnąć tę mentalność za pomocą ORM-ów, które pozwolą ci użyć rodzimych wyliczeń w twoim kod, a odpowiednie wyszukiwania SQL zostaną poprawnie utworzone podczas migracji.

Oto do nadziei, otrzymujemy stałe teksty wkrótce we're feeling a little left out.

6

Oprócz tabel odnośników (FKS), w prostych przypadkach, można użyć sprawdzić ograniczenia:

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