在TSQL中模拟枚举?

Mat*_*tin 12 t-sql sql-server

我最近意外地写了一个非常丑陋的存储过程,我希望我有枚举,

例如.

CREATE PROCEDURE Proc_search_with_enum @user int, @account_category {enum}
Run Code Online (Sandbox Code Playgroud)

我知道SQL 2000没有枚举作为第一类语言结构,您使用哪种编码约定来模拟枚举或以其他方式解决同一问题?

或者我是否注定只使用VARCHAR和IF @ account_category ='cat1'?

编辑:T-SQL和C#是客户端语言.

编辑:谢谢大家!很多好建议,我希望我能接受几个答案,我已经投票给所有人 -

答案摘要

  • 使用int在C#的枚举上倾斜.适用于C#客户端代码,使TSQL客户端代码的可读性降低.
  • 使用Char/Varchar.C#客户端代码不好(不适合本地化),使TSQL代码更具可读性.
  • 使用参数检查代码来限制参数,或者如果要将参数插入表中,则对表列或外键使用约束.

Ron*_*erg 12

你可以看一下这个问题的答案.据我所知,枚举类型不是SQL Server的一部分.

总之,最好是使用积分(INT,TINYINT,...),键入您的枚举不是字符串类型.通常,所选编程语言中的枚举类型更好地对应于整数而不是字符串.

在C#中,默认情况下每个枚举值对应一个整数,从0开始.你甚至可以在它们之间进行转换,所以这是有效的代码:

public enum MyEnum
{
    FirstEnumValue,
    SecondEnumValue
}

...

// Assuming you have opened a SqlDataReader.
MyEnum enumValue = (MyEnum) reader["account_category"];
Run Code Online (Sandbox Code Playgroud)

LINQtoSQL也支持这一点.如果您有一个枚举类型的属性,并且您的数据库列是整数类型,则转换是自动的.

  • 如果您使用这种技术,那么明确指定枚举的基础值可能是个好主意,以确保任何未来的更新不会意外地破坏C#代码与数据库值之间的相关性.例如:public enum MyEnum {FirstEnumValue = 1,SecondEnumValue = 2}等 (3认同)