2010-12-14 9 views
16

我々はC#のコードで列挙型があります。これらの値はまた、データベースフィールドに保存されている、と我々はまた、処理TSQLのたくさん(主に保存されprocsの、だけでなく、いくつかのバッチとSSISを)持っている私のSQLスクリプト/ procs全体にマジックナンバーをハードコーディングせずにTSQLでenumを使用するにはどうすればよいですか?

public enum JobStatus 
{   
    Ready = 0,  
    Running = 1,   
    Cancelling = 2, 
} 

をデータ:

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側で列挙が一致しないというリスクをどのようにして除外しますか?

は、(Iソリューションを希望のように私は、C#のタグが含まれていることC#とTSQLの両側に列挙型の「単一ソース」の定義)


更新:

データベース内に列挙型の名前を持つテーブルがないため、値はちょうど小さなint列に格納されます。

SQLプリプロセッサのように、すべての列挙型を「マジックバリュー」に拡張することを望んでいました。

+0

@OMGポニーは、ビューは、ビルドのscripsによって生成することができ、常に、データベース内のビューを更新することは容易であるとして、私は、ビューを使用しての理想のように行います。 –

答えて

0

純粋なTSQLでは、私が考えることができる唯一の類似点は、必要な値を返すスカラーUDFです。

LINQ to SQLでは、メンバーをC#/ .NETの列挙型としてマップすることができ、それを処理します。

しかし、正直言って、ほとんどの純粋なTSQLでは、私は主にリテラルを使用します。

+0

ありがとう、私は "スカラーUDF"が遅いと言われていますが、これが本当であるかどうかわかりません –

7

値は、実行しようとしているストアドproc /コマンドに常に列挙から渡すことができます。この方法では、データベースの列挙を心配する必要はありません。

データベースに列挙を保存したい場合は、私はあなたがそうのように、(おそらくあなたの列挙と題し)ビューを作成勧め:

create view JobStatus 
    select 0 as Ready, 1 as Running, 2 as Cancelling 

あなたは、アクセス/場合、ビューに参加することができますあなたはそれが必要です。

注意:クエリオプティマイザは、上記のすべての参照をテーブルスキャンではなく、一定のスキャン/スカラー操作として扱います。したがって、実際のテーブルにアクセスした場合に発生する読み込みは発生しません。

+0

いくつかの値については、テーブルを作成してデータを取り込むのは簡単です。 –

+0

ありがとう、これは大部分のTSQLでうまくいくかもしれませんが、カラムのデフォルト値からマジックナンバーを取り除く方法についての理想はありますか? –

1

1つのプロジェクトでは、データベースに期待されるテーブルと値を格納しているすべての列挙型メンバーに適用される属性を定義し、単体テストでリンクを検証しました。しかし、メッシー。

0

恐らく、通常のTSQLを使用するのではなく、SQLサーバー上でマネージコードを実装することができますか?これがうまくいくかどうかは100%ではありませんが、探検するのは選択肢かもしれません。

Possible Solution here...

関連する問題