SQL Server 2008中的枚举类型?

6
SQL Server是否有一种机制可以允许类似枚举类型的功能?
例如,如果我有一个名为“UpdateStatus”的列,它通常会设置为单个字母值,如下所示:
1. D 2. X 3. U 4. I
这可能等同于很多东西。这会导致混乱。另一种选择是将其作为字符串列,如下所示:
1. Downloaded 2. Deleted 3. Updated 4. Initialized
但这也有自己的问题。最终,有人会写出这样的代码:where UpdateStatus = 'Initalized'(拼错了)。此外,我听说以字符串为基础的键入并不是所有表现良好。
那么,SQL Server是否有任何枚举类型可以帮助解决这个问题?基本上,我正在寻找编译时检查,以确保要比较的值(即“Initialized”)是值列表的一部分。
我正在使用SQL Server 2008。

除了提出的解决方案(带有FK约束的查找表)之外,在SQL Server中没有类似“枚举”类型的功能。 - marc_s
@marc_s:太糟糕了。我本来希望可以使用一些CLR对象魔法来创建枚举类型。 - Vaccano
3个回答

10
为什么不使用包含代码和描述的查找表呢?创建指向这个查找表的外键将确保只使用有效的代码。

1
@Philip Fourie:我可以做到这一点(并且已经在数据库中有了这样的东西)。但是,“我正在寻找的是编译时检查,以确保被比较的值(即“初始化”)是值列表的一部分。” 这个解决方案提供编译时检查吗? - Vaccano
2
@Vaccano:不是的,但它可以防止数据修改异常。然而,如果这很重要,你可以设置一个匹配的枚举,在应用程序启动时进行交叉检查。加一。 - gbn
@Vaccano,抱歉我在回复时没有意识到编译时检查是如此重要。很抱歉,我不知道除了在这里提到的方法之外还有更好的方法。 - Philip Fourie

6
除了查找表(FKs)之外,在简单情况下,您可以使用检查约束:
CREATE TABLE my_table ( 
    UpdateStatus VARCHAR2(11) 
      CHECK( UpdateStatus IN ('Downloaded', 'Deleted', 'Updated', 'Initialized'))
)

1
我见过的唯一方法是使用UDF来评估枚举的字符串表示是否有效。这很慢,很痛苦,通常不值得,但至少你有一种失败时大声报错的方式。
记住,你不能在UDF中使用RAISERROR,所以你必须故意引发错误,并单独记录日志。
最终,目前解决问题的“完美”解决方案是从另一方面入手--你可以通过代码优先ORMs实现这种思路,在你的代码中使用本地枚举,相应的SQL查找将在迁移中正确创建。
希望我们能尽快获得枚举,我们感到有点被落下了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接