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

Ian*_*ose 16 c# t-sql enums

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

public enum JobStatus
{        
  Ready = 0,      
  Running = 1,        
  Cancelling = 2,
}
Run Code Online (Sandbox Code Playgroud)

这些值也存储在数据库字段中,我们有很多 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
) 
Run Code Online (Sandbox Code Playgroud)

如何避免对TSQL中的"神奇数字"进行硬编码?
如何消除枚举与C#和TSQL端不匹配的风险?

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


更新:

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

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

cas*_*One 7

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

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

create view JobStatus
    select 0 as Ready, 1 as Running, 2 as Cancelling
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要访问/加入视图.

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


Mar*_*ell 0

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

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

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