首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我如何在TSQL中使用枚举,而不是在我的SQL脚本/过程中使用硬编码魔术数字?

我如何在TSQL中使用枚举,而不是在我的SQL脚本/过程中使用硬编码魔术数字?
EN

Stack Overflow用户
提问于 2010-12-15 00:24:24
回答 5查看 2.4K关注 0票数 16

我们的C#代码中有枚举:

代码语言:javascript
复制
public enum JobStatus
{        
  Ready = 0,      
  Running = 1,        
  Cancelling = 2,
}

这些值也存储在数据库字段中,我们有TSQL的lots (主要是存储的procs,以及一些批处理和SSIS),它也处理数据:

代码语言:javascript
复制
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预处理器的东西,它可以将所有枚举“扩展”成“魔术值”。

EN

回答 5

Stack Overflow用户

发布于 2010-12-15 00:37:18

您始终可以将枚举中的值传递到您尝试执行的已存储proc/命令中。这样,您就不必担心数据库中的枚举了。

如果您希望将枚举存储在数据库中,那么我建议您创建一个视图(可能以您的枚举为标题),如下所示:

代码语言:javascript
复制
create view JobStatus
    select 0 as Ready, 1 as Running, 2 as Cancelling

然后,如果需要,您可以访问/加入视图。

请注意,查询优化器将上述引用视为常量扫描/标量操作,而不是表扫描,因此不会引起访问实际表时发生的读取。

票数 7
EN

Stack Overflow用户

发布于 2010-12-15 00:38:28

在一个项目中,我们定义了一个属性,该属性应用于存储数据库中预期的表和值的每个枚举成员,并且单元测试验证了该链接。不过还是很乱。

票数 1
EN

Stack Overflow用户

发布于 2021-09-11 13:02:53

为此,我喜欢使用表值函数。它们可以很好地一起封装和打包变量,几乎就像其他语言中的命名枚举一样。

假设我们有几个变量对应于不同的订单状态:

  • 新建= 100
  • In progress = 250
  • Completed = 500

我要做的是创建一个返回变量的函数

代码语言:javascript
复制
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

我现在可以在查询中使用我的变量,甚至智能也会提示我有关变量的信息:

代码语言:javascript
复制
SELECT
    OrderStatus.NEW
FROM dbo.OrderStatus() "OrderStatus";

或作为使用CROSS APPLY的另一个查询的一部分

代码语言:javascript
复制
SELECT
    OrderStatus.NEW
   ,*
FROM CUSTOMER_ORDERS
CROSS APPLY dbo.OrderStatus() "OrderStatus";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4441436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档