在SQL Server中处理"Enumerations"的不同方法有哪些?

tpo*_*wer 6 c# sql-server enumeration global-variables

我们目前在存储过程的顶部定义一个常量列表(大多数对应于我们在业务层中定义的枚举),如下所示:

DECLARE @COLOR_RED INT = 1
DECLARE @COLOR_GREEN INT = 2
DECLARE @COLOR_BLUE INT = 3
Run Code Online (Sandbox Code Playgroud)

但是这些通常会在许多存储过程中重复出现,因此存在大量重复.

如果过程只需要一个或两个常量,我使用的另一种技术是将它们作为参数传递给存储过程.(对于常量值使用相同的大写约定).这样我就可以确定业务层和数据层中的值是一致的.这种方法对很多值都不好.

我还有什么其他选择?

我正在使用SQL Server 2008和C#,如果它有任何区别.

更新因为我正在使用.Net是否有用户定义(CLR)类型可以帮助的方式?

Ada*_*ski 2

我可以建议两种不同的方法:

1)定义一个枚举表,以tinyint标识列为主键,枚举值作为唯一索引;例如

CREATE TABLE [dbo].[Market](
        [MarketId] [smallint] IDENTITY(1,1) NOT NULL,
        [MarketName] [varchar](32) COLLATE Latin1_General_CS_AS NOT NULL,
 CONSTRAINT [PK_Market] PRIMARY KEY CLUSTERED
(
        [MarketId] ASC
) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

然后:

  • 让您的应用程序在启动时将枚举加载到主键值映射(假设这将保持不变)。
  • 定义一个函数将枚举值转换为主键值。然后,存储过程可以使用此函数将数据插入到其他表中,以确定枚举表的外键。

2) 按照(1),但将每个主键值定义为2的幂。这允许另一个表直接引用多个枚举值,而不需要额外的关联表。例如,假设您定义一个 Color 枚举表,其值为:{1, 'Red'}、{2, 'Blue'}、{4, 'Green'}。另一个表可以通过包含外键 5(即 1 和 4 的按位或)来引用红色和绿色值。