我们的C#代码中有枚举:
public enum JobStatus
{
Ready = 0,
Running = 1,
Cancelling = 2,
}
这些值也存储在数据库字段中,我们有TSQL的lots (主要是存储的procs,以及一些批处理和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预处理器的东西,它可以将所有枚举“扩展”成“魔术值”。
发布于 2010-12-15 00:37:18
您始终可以将枚举中的值传递到您尝试执行的已存储proc/命令中。这样,您就不必担心数据库中的枚举了。
如果您希望将枚举存储在数据库中,那么我建议您创建一个视图(可能以您的枚举为标题),如下所示:
create view JobStatus
select 0 as Ready, 1 as Running, 2 as Cancelling
然后,如果需要,您可以访问/加入视图。
请注意,查询优化器将上述引用视为常量扫描/标量操作,而不是表扫描,因此不会引起访问实际表时发生的读取。
发布于 2010-12-15 00:38:28
在一个项目中,我们定义了一个属性,该属性应用于存储数据库中预期的表和值的每个枚举成员,并且单元测试验证了该链接。不过还是很乱。
发布于 2021-09-11 13:02:53
为此,我喜欢使用表值函数。它们可以很好地一起封装和打包变量,几乎就像其他语言中的命名枚举一样。
假设我们有几个变量对应于不同的订单状态:
我要做的是创建一个返回变量的函数
CREATE FUNCTION dbo.OrderStatus()
RETURNS @T_def TABLE
(
NEW int,
IN_PROGRESS int,
COMPLETED int
)
AS
BEGIN
INSERT INTO @T_def (NEW, IN_PROGRESS, COMPLETED)
VALUES (100, 250, 500);
RETURN
END
我现在可以在查询中使用我的变量,甚至智能也会提示我有关变量的信息:
SELECT
OrderStatus.NEW
FROM dbo.OrderStatus() "OrderStatus";
或作为使用CROSS APPLY的另一个查询的一部分
SELECT
OrderStatus.NEW
,*
FROM CUSTOMER_ORDERS
CROSS APPLY dbo.OrderStatus() "OrderStatus";
https://stackoverflow.com/questions/4441436
复制相似问题