我们在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预处理器那样将所有枚举“扩展”到那里“神奇的价值”。
答案 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%确定这是否有效,但它可能是一个探索的选择。