6

Có một số loại cơ chế trong SQL Server để cho phép kiểu được liệt kê như chức năng không?Các loại được liệt kê trong SQL Server 2008?

Ví dụ, nếu tôi có một cột gọi là "UpdateStatus" nó thường được thiết lập với giá trị chữ cái như vậy:

  1. D
  2. X
  3. U
  4. tôi

Điều này có thể tương đương với rất nhiều thứ. Điều đó dẫn đến sự nhầm lẫn. Cách khác là để có nó là một cột chuỗi như thế này:

  1. Việc tải xuống
  2. Deleted
  3. Cập nhật
  4. Khởi tạo

Nhưng có những vấn đề riêng của nó. Cuối cùng ai đó sẽ viết một cái gì đó như thế này: where UpdateStatus = 'Initalized' (viết sai). Thêm vào đó, tôi nghe rằng việc khóa các chuỗi không phải là tất cả những gì thực hiện.

Vì vậy, có loại loại liệt kê nào cho SQL Server có thể trợ giúp với điều này không? Về cơ bản tôi đang tìm kiếm thời gian biên dịch kiểm tra rằng một giá trị được so sánh (tức là "khởi tạo") là một phần của một danh sách các giá trị.

Tôi đang sử dụng SQL Server 2008.

+0

Không, khác mà các giải pháp đề xuất (bảng tra cứu với ràng buộc FK) không có gì trong SQL Server hoạt động giống như kiểu "enum". –

+0

@marc_s: Điều đó quá tệ. Tôi đã hy vọng rằng một số phép thuật đối tượng CLR có thể được sử dụng để tạo ra một kiểu liệt kê. – Vaccano

Trả lời

10

Tại sao không có bảng tra cứu chứa mã và mô tả. Tạo khóa ngoài cho bảng tra cứu này sẽ chỉ dẫn đến các mã hợp lệ được sử dụng.

+1

@Philip Fourie: Tôi có thể làm điều đó, (và có những thứ như vậy trong db rồi) Nhưng "Tôi đang tìm [là] ** thời gian biên dịch ** kiểm tra xem giá trị có được so sánh hay không (tức là" Được khởi tạo ") là một phần của danh sách giá trị. " Liệu giải pháp này cung cấp kiểm tra thời gian biên dịch? – Vaccano

+2

@Vaccano: không, nhưng nó cung cấp sự bảo vệ chống lại dị thường sửa đổi dữ liệu. Tuy nhiên, bạn chỉ cần thiết lập một điều tra phù hợp nếu nó quan trọng và kiểm tra chéo khi bắt đầu ứng dụng. Và +1. – gbn

+0

@Vaccano, xin lỗi đã không nhận ra * biên dịch thời gian * kiểm tra là quan trọng khi tôi trả lời. Xin lỗi tôi không biết cách nào tốt hơn là đề cập ở đây. –

1

Cách duy nhất mà tôi đã thấy điều này được thực hiện là bằng cách sử dụng một UDF để đánh giá có hay không biểu diễn chuỗi của enum là hợp lệ. Đó là chậm, nó đau đớn, và thường không có giá trị nó, nhưng ít nhất bạn có một cách để thất bại lớn tiếng thay vì âm thầm.

Và hãy nhớ, bạn không thể RAISERROR trong UDF, do đó bạn phải gây ra lỗi gây ra lỗi và ghi nhật ký riêng. Cuối cùng, tại thời điểm này, giải pháp 'hoàn hảo' cho vấn đề sẽ là tiếp cận từ phía bên kia - bạn có thể đạt được tâm lý này với một ORM mã đầu tiên, cho phép bạn sử dụng các enums tự nhiên trong mã và các tra cứu SQL tương ứng sẽ được tạo đúng cách trong quá trình di chuyển.

Dưới đây là để hy vọng chúng tôi có được sự đếm sớm, we're feeling a little left out.

6

Bên cạnh bảng tra cứu (FKS), trong trường hợp đơn giản, bạn có thể sử dụng kiểm tra các ràng buộc:

CREATE TABLE my_table ( 
    UpdateStatus VARCHAR2(11) 
     CHECK(UpdateStatus IN ('Downloaded', 'Deleted', 'Updated', 'Initialized')) 
) 
Các vấn đề liên quan