2011-08-09 10 views
0

私は、たとえば、FOO-バー - [識別番号]としてフォーマットされているテーブルの主キー列を持っているしたいと思います:SQL Serverの - フォーマットされたID列

FOO-BAR-1 
FOO-BAR-2 
FOO-BAR-3 
FOO-BAR-4 
FOO-BAR-5 

SQL Serverがこれを行うことができますか?または、シーケンスを管理するためにC#を使用する必要がありますか?その場合、EntityFramworkを使用して次の[ID番号]部分を取得するにはどうすればよいですか?

おかげ

EDIT:この列は、顧客に送信し、通知の一意の識別子を表しているため

私はこれを行うために必要です。

  • FOOは、文字列定数
  • BARが

(検出、警告または施行のいずれか)の通知の種類によって異なりますされますので、それだけでint型のアイデンティティを持っている方が良いですC#でビジネスロジックレイヤーの値を追加しますか?

+1

おそらく無意味さらに!あなたは文字列が一定であると言っていますか? –

+0

文字列はレコードのタイプによって異なります。例えば、フー-CategoryA-1はFoo-CategoryB-2等 – StarCub

+0

なぜ別の列として文字列を持っていませんか? –

答えて

3

あなたのレポートにこの「合成」欄をしたい場合は、私はあなたがすることを提案:表中のPKなど

  1. 使用INTのIDENTITYフィールド
  2. は、このテーブルのビューを作成します。このビューでは、文字列と型を使用して、必要なフィールドをさらに生成することができます。
  3. あなたrepoortsで、このビューを使用します。

しかし、私はまだDB設計の大きな問題があること、だと思います。正規化を使用して再設計しようと思います。それはVARCHAR型であるので、とにかくユニークになりますIDENTITYフィールドは、ある一方、PKは、目的にNONCLUSTEREDに設定されていることを

CREATE TABLE #test (
    id INT IDENTITY UNIQUE CLUSTERED, 
    pk AS CONCAT('FOO-BAR-', id) PERSISTED PRIMARY KEY NONCLUSTERED, 
    name NVARCHAR(20) 
) 

INSERT INTO #test (name) VALUES (N'one'), (N'two'), (N'three') 

SELECT id, pk, name FROM #test 

DROP TABLE #test 

注:

+1

計算列は、ビューの必要性を必要としないであろう、あまりにも動作する可能性があります。計算列は主キーであってはなりません。ユーザーに主キーを提供しないことがベストプラクティスです。 –

+0

合意、それは列を計算することができます。この場合、ビューは必要ありません。 –

1

テーブルにPKとして何でも設定できます。しかし、この例ではIDENTITYを自動増分intに設定し、なぜそれが使用されているかによってSQL、BLL、またはUIにFOO-BAR-を手動で追加します。 FOOBARのビジネス理由がある場合は、DB行の値として設定する必要があります。実際に値を使用する理由に応じて、2つの3つの列の間でDBにキーを作成できます。

しかし、私は本当にこのような方法でIDを連結し、それをDBに格納する本当の理由はないと思います。しかし、私は実際には自分のIDとしてintを使っています。

0

もう1つの選択肢は、私が以前に使っていた古いチームのコードとバリューテーブルを使用することです。

  1. 持つテーブルを作成します。我々は(我々はいくつかのキー・テーブルのための環境のミスマッチを防ぐために、自動インクリメントのアイデンティティの代わりにそれを使用)が、何あなたができることは、これはまさにこのためにそれを使用していませんでしたあなたの各カテゴリの行。行の2つ(またはそれ以上)の列 - カテゴリ名と次の番号の最小値。
  2. レコードを別のテーブルに挿入すると、ストアドプロシージャを実行して、そのカテゴリの次の利用可能なID番号を取得し、コードと値のテーブルの番号を1だけインクリメントし、カテゴリと番号を連結しますあなたの挿入のために。

しかしあなたがメインテーブルならインサートの多くが付いている大容量のテーブルで、それはあなたがシーケンス外のもので羽目になる可能性が可能です。

大量ではないにしても、なぜあなたはこれをやりたいのかを再検討し、より良い方法があるかどうかを見直すことをお勧めします(ビジネスレイヤ他の人が示唆しているように、UIがそれを行う)。

0

は、それはこのように計算された列を使用することによって、かなり可能ですUNIQUE CLUSTEREDに設定します。プライマリキーにFOO-バーの