Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在TSQL中使用枚举,而不在我的SQL脚本/过程中使用硬编码幻数?_C#_Tsql_Enums - Fatal编程技术网

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

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

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