C# 如何在TSQL中使用枚举,而不在我的SQL脚本/过程中使用硬编码幻数?
我们的C代码中有枚举: 这些值也存储在数据库字段中,我们有大量的TSQL(主要是存储的过程,以及一些批和SSI),它们也处理数据:C# 如何在TSQL中使用枚举,而不在我的SQL脚本/过程中使用硬编码幻数?,c#,tsql,enums,C#,Tsql,Enums,我们的C代码中有枚举: 这些值也存储在数据库字段中,我们有大量的TSQL(主要是存储的过程,以及一些批和SSI),它们也处理数据: SELECT TOP 1 @JobSID = JobSID FROM Job WHERE Status = 0 /* JobStatus.Ready */ ORDER BY SubmitDate ASC CREATE TABLE ImportCrossEffect( /* lots deleted */ Source tinyint
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两侧的枚举定义)
更新: 数据库中没有包含枚举名的表,这些值只存储在极小的int列中
我希望有一个类似SQL预处理器的东西,可以“扩展”所有枚举到“神奇值”。在纯TSQL中,我能想到的唯一类似的东西是返回所需值的标量UDF 在LINQ to SQL中,您可以将成员映射为c#/.NET枚举,并由它为您处理
但老实说;在大多数纯TSQL中,我主要使用文本。您总是可以将枚举中的值传递到您试图执行的存储过程/命令中。这样,您就不必担心数据库中的枚举 如果要将枚举存储在数据库中,我建议您创建一个视图(可能带有枚举的标题),如下所示:
create view JobStatus
select 0 as Ready, 1 as Running, 2 as Cancelling
然后,如果需要,可以访问/加入视图
注意,查询优化器将上述任何引用视为常量扫描/标量操作,而不是表扫描,因此,在访问实际表时不会发生读取。在一个项目中,我们定义了一个属性,该属性应用于存储表和数据库中预期值的每个枚举成员,单元测试验证了该链接。但是很混乱。也许您可以在SQL server上实现托管代码,而不是使用普通的TSQL?不是100%确定这是否可行,但这可能是一个探索的选项
谢谢,有人告诉我“标量UDF”很慢,我不知道这是否是真的。对于一些值,创建表并填充它是很简单的。谢谢,这可能适用于大多数TSQL,有没有关于如何从列的默认值中删除幻数的想法?@OMG Ponies,我很喜欢使用视图的理想,因为视图可以由构建脚本生成,并且在数据库中更新视图总是很容易的。
create view JobStatus
select 0 as Ready, 1 as Running, 2 as Cancelling