6

We currently define a list of constants (mostly these correspond to enumerations we have defined in the business layer) at the top of a stored procedure like so:

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

But these often get repeated for many stored procedures so there is a lot of duplication.

Another technique I use if the procedure needs just one or two constants is to pass them in as parameters to the stored procedure. (using the same convention of upper case for constant values). This way I'm sure the values in the business layer and data layer are consistent. This method is not nice for lots of values.

What are my other options?

I'm using SQL Server 2008, and C# if it makes any difference.

Update Because I'm using .Net is there any way that user defined (CLR) types can help?

4

5 に答える 5

3

これは物議を醸すかもしれません。私の考えは、T-SQLで列挙を使用しないことです。T-SQLは、列挙型が他の言語で使用されているように、列挙型を便利にするように実際に設計されているわけではありません。私にとって、T_SQLでは、他の場所で見られるメリットなしに、労力と複雑さを追加するだけです。

于 2009-07-29T16:08:32.193 に答える
2

2 つの異なるアプローチを提案できます。

1) tinyintID 列を主キーとし、列挙値を一意のインデックスとする列挙テーブルを定義します。例えば

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'} の値を持つ Color 列挙テーブルを定義するとします。別のテーブルは、外部キー 5 (つまり、1 と 4 のビット単位の OR) を含めることで、赤と緑の値を参照できます。

于 2009-07-29T08:40:46.073 に答える
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
于 2009-07-29T09:31:02.523 に答える
1

スカラー関数を定数として使用するのはどうですか。命名規則により、それらの使用法は列挙型に近くなります。

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

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

...
于 2009-10-13T21:24:12.387 に答える
1

複数の場所でストアド プロシージャの効果的な定数を定義するという考えは好きではありません。これはメンテナンスの悪夢のようで、エラー (入力ミスなど) が発生しやすいためです。実際、そのようなことをしなければならない状況はあまり見当たりませんか?

すべての列挙定義を 1 か所 (C# クラス) に保持することは間違いありません。それが毎回手順にそれらを渡さなければならないことを意味する場合は、そうしてください. 少なくともそのように、それらは 1 つの場所でのみ定義されます。

これを簡単にするために、列挙型パラメーターを自動的に渡すプロシージャーを呼び出すためのヘルパー メソッドをいくつか作成できます。したがって、プロシージャ名と「変数」パラメーターのみを使用してヘルパー メソッドを呼び出すと、ヘルパー メソッドが残りの列挙パラメーターを追加します。

于 2009-07-29T09:42:25.433 に答える