c# - 我如何在 SQL 中使用枚举而不在我的 SQL 脚本/过程中硬编码魔数(Magic Number)?

标签 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 中对“魔数(Magic Number)”进行硬编码?
如何消除枚举在 C# 和 TSQL 端不匹配的风险?

(我已经包含了 C# 标记,因为我想要“单一来源”枚举在 C# 和 TSQL 端的定义的解决方案)


更新:

我们在数据库中没有包含枚举名称的表,值仅存储在微小的 int 列中。

我希望有类似 SQL 预处理器的东西,它可以将所有枚举“扩展”到那里的“神奇值”。

最佳答案

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

如果您想将枚举存储在数据库中,那么我建议您创建一个 View (可能以您的枚举命名),如下所示:

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

然后,如果需要,您可以访问/加入 View 。

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

关于c# - 我如何在 SQL 中使用枚举而不在我的 SQL 脚本/过程中硬编码魔数(Magic Number)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441436/

相关文章:

sql - 如何在 SQL MERGE 语句中使用 GROUP BY 子句?

c# - 基于列合并两个列表

c# - 是枚举到枚举拳击还是只是类型转换

c# - 如何判断浮点除法的结果是否应该是整数?

SQL Server : How to calculate different sums in a single query

swift - switch 性能优于枚举情况 O(1)

c++ - 模板结构中的枚举

c# - 单次序列化/反序列化大对象与多次序列化/反序列化小对象?

c# - 从 asp.net c# 中的服务器错误接收结果时发生传输级错误

c# - VS 2010 类图 - 可以删除按字母顺序排序吗?