我们在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预处理器那样将所有枚举"扩展"到那里"神奇的价值".
您始终可以将枚举中的值传递给您尝试执行的存储过程/命令.这样,您就不必担心数据库中的枚举.
如果要将枚举存储在数据库中,那么我建议您创建一个视图(可能标题为枚举),如下所示:
create view JobStatus
select 0 as Ready, 1 as Running, 2 as Cancelling
Run Code Online (Sandbox Code Playgroud)
然后,您可以根据需要访问/加入视图.
请注意,查询优化器将对上述任何引用视为常量扫描/标量操作,而不是表扫描,因此如果您访问实际表,则不会产生读取.
在纯 TSQL 中,我能想到的唯一类似的事情是返回所需值的标量 UDF。
在 LINQ to SQL 中,您可以将成员映射为 c#/.NET 枚举,它会为您处理它。
但说实话;在大多数纯 TSQL 中,我主要只使用文字。
| 归档时间: |
|
| 查看次数: |
2296 次 |
| 最近记录: |