如何在SQL中使用枚举而不在我的SQL脚本/过程中使用硬编码幻数?

时间:2010-12-14 16:24:24

标签: c# tsql enums

我们在C#代码中有枚举:

public enum JobStatus
{        
  Ready = 0,      
  Running = 1,        
  Cancelling = 2,
}

这些值也存储在数据库字段中,我们有批次的TSQL(主要是存储过程,以及一些批次和SSIS),它们也处理数据:

SELECT TOP 1 @JobSID = JobSID
FROM Job 
WHERE Status = 0 /* JobStatus.Ready */
ORDER BY SubmitDate ASC

CREATE TABLE ImportCrossEffect(
    /* lots deleted */      
    Source tinyint 
      DEFAULT 1 NOT NULL -- 0: Unknown (default), 1:Imported, 2:Keyed
) 

如何避免对TSQL中的“幻数”进行硬编码?
如何消除枚举在C#和TSQL方面不匹配的风险?

(我已经包含了C#标签,因为我希望解决方案“单一来源”C#和TSQL方面的枚举定义)


更新

我们在数据库中没有包含Enum名称的表,这些值只存储在很小的int列中。

我希望像SQL预处理器那样将所有枚举“扩展”到那里“神奇的价值”。

4 个答案:

答案 0 :(得分:7)

您始终可以将枚举中的值传递给您尝试执行的存储过程/命令。这样,您就不必担心数据库中的枚举。

如果你想将枚举存储在数据库中,那么我建议你创建一个视图(可能标题为你的枚举),如下所示:

create view JobStatus
    select 0 as Ready, 1 as Running, 2 as Cancelling

如果需要,您可以访问/加入视图。

请注意,查询优化器会将对上述内容的任何引用视为常量扫描/标量操作,而不是表扫描,因此如果您访问实际表,则不会产生读取。

答案 1 :(得分:1)

在一个项目中,我们定义了一个属性,该属性应用于存储数据库中预期的表和值的每个枚举成员,并且单元测试验证了链接。但是很乱。

答案 2 :(得分:0)

在纯TSQL中,我能想到的唯一类似的东西是标量UDF,它返回所需的值。

在LINQ to SQL中,您可以将成员映射为c#/。NET枚举,并为您处理。

但说实话;在大多数纯粹的TSQL中,我主要只使用文字。

答案 3 :(得分:0)

也许你可以在SQL服务器上实现托管代码而不是使用普通的TSQL?不是100%确定这是否有效,但它可能是一个探索的选择。

Possible Solution here...