如何在TSQL中使用枚举,而不对SQL脚本/proc进行硬编码?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我们在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方面的枚举定义)

提问于
用户回答回答于

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

用户回答回答于

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

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

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

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

扫码关注云+社区