Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008中的枚举类型?_Sql Server_Tsql_Sql Server 2008_Enumeration_Enumerated Types - Fatal编程技术网

Sql server SQL Server 2008中的枚举类型?

Sql server SQL Server 2008中的枚举类型?,sql-server,tsql,sql-server-2008,enumeration,enumerated-types,Sql Server,Tsql,Sql Server 2008,Enumeration,Enumerated Types,SQL Server中是否有某种机制允许枚举类型的功能 例如,如果我有一个名为“UpdateStatus”的列,它通常会使用单字母值进行设置,如下所示: D X U 我 这相当于很多事情。这导致了混乱。另一种方法是将其设置为如下所示的字符串列: 下载 删除 更新 初始化 但这也有其自身的问题。最终有人会写这样的东西:where UpdateStatus='initialized'(拼写错误)。另外,我听说对字符串进行键控并不是那么有效 那么,是否有任何类型的SQL Server枚举类型可以帮助解

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

例如,如果我有一个名为“UpdateStatus”的列,它通常会使用单字母值进行设置,如下所示:

  • D
  • X
  • U
  • 这相当于很多事情。这导致了混乱。另一种方法是将其设置为如下所示的字符串列:

  • 下载
  • 删除
  • 更新
  • 初始化
  • 但这也有其自身的问题。最终有人会写这样的东西:
    where UpdateStatus='initialized'
    (拼写错误)。另外,我听说对字符串进行键控并不是那么有效

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


    我正在使用SQL Server 2008。

    为什么不使用包含代码和说明的查找表。为此查找表创建外键将导致仅使用有效代码。

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

    请记住,您不能在UDF中引发错误,因此您必须引发一个有意引发错误的事件,并单独记录

    最终,目前,解决这个问题的“完美”解决方案是从另一方面着手——您可以使用代码优先的ORMs实现这种思路,这将允许您在代码中使用本机枚举,并且相应的SQL查找将在迁移中正确创建

    希望我们能尽快得到枚举,除了查找表(FK),在简单的情况下,您可以使用检查约束:

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

    @Philip Fourie:我可以这样做,(而且数据库中已经有了这种东西),但是“我正在寻找的是编译时检查一个正在比较的值(即“初始化”)是否是一个值列表的一部分。”这个解决方案提供编译时检查吗?@Vaccano:没有,但它提供了防止数据修改异常的保护。不过,若匹配枚举非常重要,只需设置一个匹配枚举,并在应用程序启动时进行交叉检查。和+1。@Vaccano,抱歉,当我回答时,没有意识到编译时检查是如此重要。很抱歉,我不知道还有比这里提到的更好的方法。没有,除了建议的解决方案(带FK约束的查找表)之外,SQL Server中没有任何类似于“枚举”类型的方法。@marc_s:那太糟糕了。我希望可以使用一些CLR对象来创建枚举类型。