我们的 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/