SQL Server 2008を使用してIDENTITY_INSERTをオンまたはオフにする方法は?


461

IDENTITY_INSERTがOFFに設定されているときに挿入を実行するとエラーが発生するのはなぜですか?

SQL Server 2008で適切に有効にするにはどうすればよいですか?SQL Server Management Studioを使用していますか?

私はこのクエリを実行しました:

SET IDENTITY_INSERT Database. dbo. Baskets ON

次に、コマンドが正常に完了したというメッセージがコンソールに返されました。ただし、アプリケーションを実行すると、以下のエラーが表示されます。

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

あなたが何をしようとしているのか理解できるように、この質問を展開してください。このエラーが発生したときに実行しているステートメントは何ですか。また、エラーメッセージの実際のテキストは何ですか。
Matt Gibson

別の質問をしたとしても、ここで回答を受け入れる必要があります。私たちはあなたの質問に答えまし
gbn 2011

8
誰かがアプリケーションからID値を送信しようとしているという考えには恐怖があります。これは、まれなデータ移行を除いて、実行する必要があることではありません。これをアプリケーションから実行するのに十分な頻度で定期的に実行している場合は、おそらくテーブル設計を再検討する必要があります。
HLGEM 2013年

これをSQLスクリプトバックアップで使用しています。これにより、復元中にデータを元の値で自動インクリメントテーブルにロードできます。スクリプトバックアップを使用すると、SQLデータベースをダウングレードできます。Management Studioのスクリプトバックアップの実現により、バイナリデータをテキストフィールドに格納すると、スクリプトをロードできなくなります。
ジェッテロ2017年

回答:


771

MSDNによるSQL経由

SET IDENTITY_INSERT sometableWithIdentity ON

INSERT INTO sometableWithIdentity 
    (IdentityColumn, col2, col3, ...)
VALUES 
    (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF

完全なエラーメッセージは、何が間違っているかを正確に伝えます...

IDENTITY_INSERTがOFFに設定されている場合、テーブル 'sometableWithIdentity'のID列に明示的な値を挿入できません。


@Beginner:あなたはそうです、それゆえエラーです。値を挿入したくないことをどのように知ることができますか?エラーメッセージのみが表示されます
gbn

3
DB.SaveChanges();を実行すると、アプリからエラーが発生します。
2011

5
いいえ、ID列の値の送信を停止します。または、アプリで値を送信する場合に設定しますが、値を生成するように設定されたIDプロパティを持つ列があるのはなぜですか?私たちはあなたのために決めることはできません
gbn '15

22
@Beginner:設定は現在のセッションにのみ適用されます(この質問に対してだれもそれを指摘していません)。したがって、アプリケーションがそのような挿入を実行するためには、アプリケーションをオンにする必要があります(そして、おそらくすぐにオンにするのが最善です) gbnが示すように、そのような挿入が完了したときに再びオフになります)。Ismaelが示唆しているように、明示的な挿入列が指定されていない(?)場合、ID列に値を挿入する方法がわかりませんが、SQL Serverの古いバージョンでは、すべての列に暗黙的に含まれていました。
Rob Parker

2
@ロブ、私はあなたがポイントを持っていると私は個人的に列を指定せずに挿入しないコードのコードレビューに失敗したと思う。エラーで浪費された時間は別として、これは危険な慣行であり、列データが正しく一致しない場合、深刻なデータ整合性の問題が発生する可能性があります。
HLGEM 2013年

59

IDENTITY_INSERTをONに設定しても、挿入できないという問題がありました。

問題は、列名を指定しなかったことと、何らかの理由でそれが気に入らなかったことです。

INSERT INTO tbl Values(vals)

したがって、基本的に完全なINSERT INTO tbl(cols)値(vals)を実行します


6
回答ペインでは質問しないでください。
Duk

4
これは、列リスト(テーブルの両方の列、なんとか)を指定するために私が望んでいたものでした
Maslow

36

インポート: 列をINSERTステートメントに書き込む必要があります

INSERT INTO TABLE
SELECT * FROM    

不正解です。

Insert into Table(Field1,...)
Select (Field1,...) from TABLE

正しい


2
非常に有用だったこと、ありがとう
ホセ・ロメロ

1
両方のテーブルに同じ列がある場合、次のようにselect(Field1 ..)に列をリストせずに実行できます。...Table(Field1、...)に挿入します。*からTABLE ...を選択し、最初に挿入するIDフィールドdo ** SET IDENTITY_INSERT Table_name ON
user3590235

@ user3590235これは、列リストが同じであるという危険な仮定です。手動のユーザークエリ以外では、絶対に実行しないでください。参照を更新せずに誰かがテーブル定義を変更したときに、PRODがいつか壊れることを保証します。
Elaskanator

5

私はこれが古いスレッドであることを知っていますが、これにぶつかっただけです。ユーザーが他のセッションSet IDENTITY_INSERT ONの後にIdentity列で挿入を実行しようとすると、上記のエラーが発生します。

Identity Insert値の設定と後続のInsert DMLコマンドは、同じセッションで実行されます。

ここで、@ BeginnerはIdentity Insertを個別にONに設定してから、アプリケーションから挿入を実行していました。それが彼が以下のエラーを得た理由です:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

0

これは、PRIMARY KEYフィールドがあり、重複している値を挿入している場合、またはINSERT_IDENTITYフラグをオンに設定している場合に発生する可能性があります


0

SET IDENTITY_INSERT Database.dbo.Baskets ON;すべてのSQL INSERT送信バッチの前にaを置く必要があるようです。

最初にINSERT ... VALUES ...1つのSET IDENTITY_INSERT ... ON;文字列で始まる複数のコマンドを送信できます。間にバッチ区切りを入れないでください。

SET IDENTITY_INSERT ... ON送信ブロックの後にが機能しなくなる理由がわかりません(例:.ExecuteNonQuery()C#の場合)。SET IDENTITY_INSERT ... ON;次のSQLコマンド文字列の先頭にもう一度置く必要がありました。


多分これはあなたの質問に答える:stackoverflow.com/questions/5791941/...
Demetris Leptos

-1

ID挿入を設定した後、コマンド「go」を追加する必要があります。例:

SET IDENTITY_INSERT sometableWithIdentity ON
go

INSERT sometableWithIdentity (IdentityColumn, col2, col3, ...)
VALUES (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF
go

5
この質問は4歳で、回答は認められています。あなたの回答は、受け入れられた回答と重複しています
Ghost

13
まあ、正確な複製ではありません-彼は「go」コマンドを含みました...;)
RoastBeast
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.