6

在SQL Server中是否有某种机制允许枚举类型的功能?SQL Server 2008中的枚举类型?

例如,如果我有一个称为 “UpdateStatus” 一栏它通常得到设置有单个字母的值,象这样:

  1. d
  2. X
  3. ù

这可能等同于很多事情。这会导致混淆。另一种方法是有它是一个字符串列是这样的:

  1. 视频下载
  2. 删除
  3. 更新
  4. 初始化

但是,有其自身的问题。最终有人会写这样的:where UpdateStatus = 'Initalized'(拼写错误)。另外我听说键入字符串并不是全部的表现。

那么,有什么样的SQL Server的枚举类型,可以帮助这个?基本上我正在寻找编译时检查一个正在比较的值(即“初始化”)是值列表的一部分。

我使用SQL Server 2008的

+0

没有,其他的,所提出的解决方案(查找表与FK约束)SQL Server中没有像“枚举”类型一样工作。 – 2010-03-03 17:36:00

+0

@marc_s:那太糟糕了。我希望可以使用一些CLR对象魔法来创建一个枚举类型。 – Vaccano 2010-03-03 17:43:47

回答

10

为什么不包含代码和说明的查找表。为这个查找表创建一个外键只会导致使用有效的代码。

+1

@Philip Fourie:我可以这样做(并且已经在db中拥有这种类型的东西)但是,“我正在寻找的是编译时间**检查正在比较的值(即”初始化“)是价值清单的一部分。“此解决方案是否提供编译时检查? – Vaccano 2010-03-03 17:30:11

+2

@Vaccano:不,但它可以防止数据修改异常。但是,只要设置了匹配的枚举,如果它非常重要并对应用程序启动进行交叉检查。和+1。 – gbn 2010-03-03 18:23:53

+0

@Vaccano,抱歉没有意识到*编译时间*检查是我回应时的重要。对不起,我不知道比这里提到的更好的方法。 – 2010-03-04 08:53:49

1

我看到完成的唯一方法是使用UDF来评估枚举的字符串表示是否有效。它很慢,很痛苦,而且通常不值得,但至少你有办法大声而不是默默地失败。

请记住,您无法在UDF中RAISERROR,因此您必须导致错误导致错误并单独记录。

最终,目前,问题的“完美”解决方案将从另一端走向 - 您可以通过代码优先的ORM实现这一思路,这将允许您在您的本地枚举中使用本地枚举代码,并且相应的SQL查找将在迁移中正确创建。

我们也希望我们很快得到枚举,we're feeling a little left out.

6

除了查找表(FKS),在简单的情况下,你可以使用检查约束:

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