我们目前在存储过程的顶部定义一个常量列表(大多数对应于我们在业务层中定义的枚举),如下所示:
DECLARE @COLOR_RED INT = 1
DECLARE @COLOR_GREEN INT = 2
DECLARE @COLOR_BLUE INT = 3
但是这些通常会在许多存储过程中重复出现,因此存在大量重复。
如果过程只需要一个或两个常量,我使用的另一种技术是将它们作为参数传递给存储过程。 (对于常量值使用相同的大写约定)。这样我就可以确定业务层和数据层中的值是一致的。这种方法对很多值都不好。
我的其他选择是什么?
我正在使用SQL Server 2008和C#,如果它有任何区别。
更新因为我正在使用.Net是否有用户定义(CLR)类型可以帮助的方式?
答案 0 :(得分:3)
这可能是有争议的:我的看法是不使用T-SQL中的枚举。 T-SQL并没有真正设计成使枚举有用的方式,就像它们在其他语言中的方式一样。对我而言,在T_SQL中,他们只是增加了努力和复杂性而没有在其他地方看到的好处。
答案 1 :(得分:2)
我可以建议两种不同的方法:
1)定义一个枚举表,其中tinyint
标识列为主键,枚举值为唯一索引; e.g。
CREATE TABLE [dbo].[Market](
[MarketId] [smallint] IDENTITY(1,1) NOT NULL,
[MarketName] [varchar](32) COLLATE Latin1_General_CS_AS NOT NULL,
CONSTRAINT [PK_Market] PRIMARY KEY CLUSTERED
(
[MarketId] ASC
) ON [PRIMARY]
) ON [PRIMARY]
然后:
2)按照(1),但将每个主键值定义为2的幂。这允许另一个表直接引用多个枚举值,而无需额外的关联表。例如,假设您定义了一个颜色枚举表,其值为:{1,'Red'},{2,'Blue'},{4,'Green'}。另一个表可以通过包含外键5(即1和4的逐位OR)来引用红色和绿色值。
答案 2 :(得分:2)
标量用户定义函数?不完美,但功能......
CREATE FUNCTION dbo.ufnRGB (
@Colour varchar(20)
)
RETURNS int
AS
BEGIN
DECLARE @key int
IF @Colour = 'BLue'
SET @key = 1
ELSE IF @Colour = 'Red'
SET @key = 2
ELSE IF @Colour = 'Green'
SET @key = 3
RETURN @KEy
END
答案 3 :(得分:1)
我不喜欢在多个地方定义存储过程的有效常量的想法 - 这似乎是一个维护噩梦,很容易出错(错别字等)。事实上,当你需要做这样的事情时,我真的看不到很多情况?
我肯定会将所有枚举定义保存在一个地方 - 在C#类中。如果这意味着每次都必须将它们传递给您的程序,那就这样吧。至少就是这样,它们只能在一个地方定义。
为了使这更容易,您可以编写一些帮助方法来调用您自动为您传递枚举参数的过程。因此,只使用过程名称和“变量”参数调用辅助方法,然后辅助方法为您添加其余的枚举参数。
答案 4 :(得分:1)
如何将标量函数用作常量。命名约定会使它们的使用接近枚举:
CREATE FUNCTION COLOR_RED()
RETURNS INT
AS
BEGIN
RETURN 1
END
CREATE FUNCTION COLOR_GREEN()
RETURNS INT
AS
BEGIN
RETURN 2
END
...