2009-07-29 58 views
6

我們目前定義的常量列表(主要是這些對應於枚舉我們在業務層中定義),在存儲過程的頂部像這樣:在SQL Server中處理'Enumerations'有哪些不同的方法?

DECLARE @COLOR_RED INT = 1 
DECLARE @COLOR_GREEN INT = 2 
DECLARE @COLOR_BLUE INT = 3 

但這些常常會重複很多存儲過程等等有很多重複。

如果過程只需要一個或兩個常量,我使用的另一種技術是將它們作爲參數傳遞給存儲過程。 (對於常量值,使用大寫的相同慣例)。這樣我確信業務層和數據層中的值是一致的。這種方法對於很多值不是很好。

我的其他選擇是什麼?

我正在使用SQL Server 2008和C#,如果它有任何區別。

更新因爲我使用.Net有什麼方式可以幫助用戶定義(CLR)類型?

回答

2

我可以建議兩種不同的方法:

1)定義的Enumeration表與tinyint標識列作爲主鍵和枚舉值作爲唯一的索引;例如

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的冪。這允許另一個表直接引用多個枚舉值,而不需要額外的關聯表。例如,假設您定義了一個Color枚舉表,其值爲{1,'Red'},{2,'Blue'},{4,'Green'}。另一個表可以通過包含外鍵5(即1和4的按位OR)來引用紅色和綠色值。

+0

枚舉上的外鍵很好,但在存儲過程中如何使用這些值? – tpower 2009-07-29 08:58:12

+0

@tpower:不完全確定我理解你的問題,但我通常會將枚舉字符串值傳遞給存儲過程,並立即使用我提到的函數將它們轉換爲外鍵。因此,該應用程序只處理枚舉值,DB代碼只處理外鍵值。 – Adamski 2009-07-29 10:02:26

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 
1

我不喜歡的定義是什麼有效常數在多個地方存儲過程的想法 - 這似乎是一個維護的噩夢,是容易受到錯誤(拼寫錯誤等)。事實上,當你需要做這樣的事情時,我看不到很多情況嗎?

我肯定會把所有的枚舉定義放在一個地方 - 在你的C#類中。如果這意味着每次都必須將它們傳遞給您的程序,那就這樣吧。至少這樣,他們只能在一個地方定義。

爲了使這更容易,你可以編寫一些幫助程序來調用你的程序,這些程序會自動地爲你傳遞枚舉參數。所以你只需要調用一個helper方法,只需要過程名和「變量」參數,然後輔助方法爲你添加其餘的枚舉參數。

3

這可能是有爭議的:我的採取是不使用T-SQL中的枚舉。 T-SQL的設計方式並不是讓枚舉有用,而是用其他語言的方式。對我而言,在T_SQL中,他們僅僅增加了努力和複雜性,卻沒有在別處看到的好處。

1

如何使用標量函數作爲常量。命名約定會使它們的用法接近於枚舉:

CREATE FUNCTION COLOR_RED() 
RETURNS INT 
AS 
BEGIN 
    RETURN 1 
END 

CREATE FUNCTION COLOR_GREEN() 
RETURNS INT 
AS 
BEGIN 
    RETURN 2 
END 

... 
相關問題