2012-04-18 5 views
2

SQL Serverに自動インクリメントID列がありますが、行の1つに特定の値を指定します。番号体系は次のようになります。SQL Serverの自動インクリメント列に特定の値を指定する方法はありますか。

1 ..., 
2...., 
999 - for the reserved entry, 
3...., 
n.... 

どうすればいいですか?

+0

行998を挿入するときは注意が必要です。次のインサートがPKの制約に違反するため(この時点で999がすでに存在しているため) –

+0

Jim Bに感謝します。このテーブルは十分に小さく、予約番号に達することはないと想定しています。 – Achilles

+0

問題ありません。私たちはここでこのような何かを持っていました。ここでは1-499が予約されていると判断したため、IDシードは500で開始しました。シナリオに役立つかどうかはわかりません。 –

答えて

6

あなたはIDENTITY_INSERTを使用する必要があります。

SET IDENTITY_INSERT MyTableName ON 

INSERT INTO MyTableName 
(IdField, <list of all the fields>) 
VALUES 
(999, <list of other values) 

SET IDENTITY_INSERT MyTableName OFF 

DBCC CHECKIDENT(MyTableName, RESEED, 2) 

あなたはまた、INSERT文で明示的なフィールドのリストを使用する必要があり、セッションごとに一つの活性IDENTITY_INSERTに限定されています。

これは、現在のID値よりも高い場合、挿入した値にシード値をリセットします。

これもまたDBCC CHECKIDENTを使用して回避することができますが、管理するのは非常に苦労します。

+0

ありがとうJNK、あなたの答えにDBCCコールを追加しました。 – Achilles

5

あなたはIDENTITY_INSERTを使用することができます。これに頼ら

SET IDENTITY_INSERT [tablename] ON; 
INSERT INTO [tablename] (identitycolumn, ...) VALUES (999, ...); 
SET IDENTITY_INSERT [tablename] OFF; 

は、常にコードのにおいです。これは、表の集団またはデータの複製のためのデータロードの練習として許容されます。アプリがIDを「予約」することは悪い習慣であり、データモデルの設計上の欠陥を示しています。

+1

+1はコードの臭いのコメントです。 – JNK

+0

あなたはrusanuのコンサルティングからサービスブローカーの達人ですか?あなたのダイアログプールのテクニックが本当にサービスブローカーの力に私の目を開いた場合。 – Namphibian

関連する問題