2009-06-26 62 views
5

コードでは、グローバルにアクセス可能な定数/ enums/etcを一度指定してから、アプリケーションから再利用することができます。これは、 '2'のような数字の代わりに 'Mazda'のような意味のある名前を使うことができます。SQL Serverで「Magic」番号を取り除く方法

SQL Serverのストアドプロシージャでも同じことを実行したいが、これを実装する最善の方法は不明である。

次のテーブルの例:(ことわざ車スキーマ):

Car  ManufacturerId 
350Z  1 
Hilux  2 
Yaris  2 

ManufacturerId Name 
1    Nissan 
2    Toyota 

ので、代わりの

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan 

を書く私たちは、

SELECT * FROM Car WHERE ManufacturerId = @Nissan 

一つの制限のようなものを書きたいです私たちはメーカーの名前に頼ることができないということです。それは余分が参加し、スペルミスすることができ、文字列の比較で使用するよう

SELECT * 
FROM Car c 
    INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId 
WHERE m.Code = 'Nissan' 

私はこの上のビット躊躇だ:私たちは、カラム変化しないと、このように検索された結合決して「コード」を持っていることについて考えていました。

すべてのストアドプロシージャで変数を宣言することなくこれを達成するには、どのような方法が最適ですか?

答えて

4

我々はカップルの方法でこれをやった:名前が「マジックナンバー」を返し

  • ユーザー定義関数を。
  • intカラムの代わりにnchar(4)カラムを使用し、少し紛らわしくないコードを思いついてください。ですから、日産は1ではなくNISNになります。
+0

最初の提案ではおもしろいですが、2番目の提案では遅すぎます。また今度。 –

+0

この問題では難しいのは、通常、マジックナンバーがクライアントコードの列挙型に対応していることです。ある時点で、SQLルックアップをクライアント列挙と同期させることになります。 MS SQL Serverは、ここで非常にきちんとした統合ポイントを提供しています.CLR UDFをコード化してenum値を返すことができ、基本的にランタイム・タイプの安全性が強化されています。あなたは依然としてクエリが列挙型の値の名前を取得していることを確認する必要がありますが、私は問題のこの部分を回避する方法を見つけたことはありません。 –

1

データベースに数値を格納する必要はありません。そこにはDB管理者がいて、「ナチュラルキー」という考え方をまだ愛しています。 IDを使用する代わりに、メーカー固有のナチュラルキーを使用するだけです。多くの場合、これは複数の主キーにつながります。メーカーのユニークな識別子として 'Mazda' 'Canada'を持っていなければならないかもしれません。

個人的には、私はこの方法が嫌い、自分のテーブルに格納されている識別可能なオブジェクトごとに一意のIDを持つことを好みます。これは、ルックアップである新しいテーブルを作成することを意味します。 2、「マザダ」。次に、データベースに2がある場所で 'Mazda'をプルするビューを作成し、ビューに対してクエリを実行することができます。 SELECT * from v_cars where maker = 'Mazda'

+0

配列を変更するのが遅くなることに加えて、コードでenumを使いやすくするため、これらの場合に自然キーを使用しないことに同意します。 私はビューのアイデアが好きです。 –

関連する問題