2012-04-30 4 views
0

私はSharedNumberというテーブルを持っています。フィールドは1つしかありません。LastNumberという1つのフィールドしかありません。相互に共有されたベースから一連のインクリメントされた数字を生成する

このLastNumberエントリを共通の参照ポイントとして使用する、完全に独立した約40または50のアクセスデータベースがあります。基本的に、それ自身で生成することができないシステムのために一意の主キーを手動で生成するために使用されています。それは醜くて面倒です。私は徐々にそれらを一つずつ離していきますが、その間にSQL Serverでこの同じエントリを参照するプロセスを構築する必要があります。

Iは、以下を扱う午前:

共有番号テーブル:

create table SharedNumber 
( 
    [LastNumber] int not null 
) ON [PRIMARY] 


Insert into SharedNumber 
values 
(234) --This is the most recent shared number 

入力データテーブル(InputTable)新しいエントリを継続的に受け取る予定であり、新しいContractIDフィールド値は、LastNumberをインクリメントして手動で生成する必要があります。簡単に言うと、このテーブルがNameに一意に定義されているとします。

create table InputTable 
(

    [ContractID] int NULL, 
    [Name] varchar(50) not null 
) ON [PRIMARY] 


Insert into InputTable 
values 
(101,'ABC'), 
(102,'DEF'), 
(NULL,'GHI'), 
(NULL,'JKL'), 
(NULL,'MNO') 

エントリー「GHI」、「JKL」と「MNOは」ContractID値を必要とするので、私は漸進LastNumberに基づいて、彼らのために新しい番号を作成し、生成された最後の1にLastNumberを更新したいです。私が欲しい最終的な結果は次のとおりです。

ContractID Name 
101   ABC 
102   DEF 
235   GHI 
236   JKL 
237   MNO 


LastNumber 
237 

誰もがこれを行うには良い方法についてのアイデアはありますか?

答えて

1

1つのオプションは、契約テーブルのDDLでこれを直接行うことです。これは2つの列と計算列を使用します。

create table whatever (
    BuiltInContractId int identity(1000000,1) not null, -- the 1000000 is just to set a range for contract ids 
    OverrideContractId int, -- what a user inputs, 
    ContractId as coalesce(OverrideContractId, BuiltInContractId), 
    . . . 
) 
0

挿入時に代わりにトリガーを使用します。

またはそれ以上:アプリケーションロジックの問題を中央の場所で解決します。

関連する問題