1. ホーム
  2. sql-server

[解決済み】テーブルのID列に明示的な値を指定できるのは、列リストを使用し、IDENTITY_INSERTがONの場合のみです SQL Server

2022-04-03 06:02:57

質問

私はこのクエリを実行しようとしています

INSERT INTO dbo.tbl_A_archive
  SELECT *
  FROM SERVER0031.DB.dbo.tbl_A

を実行しても

set identity_insert dbo.tbl_A_archive on

このようなエラーメッセージが表示されます。

<ブロッククオート

テーブル 'dbo.tbl_A_archive' の ID 列の明示的な値は、列リストを使用し、IDENTITY_INSERT が ON の場合にのみ指定できます。

tbl_A は、行と幅が巨大なテーブルで、つまり多くの列があります。すべての列を手動で入力するのは嫌です。どうしたらうまくいくでしょうか?

どのように解決するのですか?

概要

SQL Server は、列リストを使用しない限り、ID 列に明示的な値を挿入することを許可しません。したがって、以下のオプションがあります。

  1. 列リストを作成する(手動またはツールを使用、下記参照)

または

  1. の ID カラムを作成します。 tbl_A_archive を通常の 非同一性 カラムを使用します。テーブルがアーカイブテーブルで、常に ID 列に明示的な値を指定している場合、なぜ ID 列が必要なのでしょうか? 代わりに普通のintを使えばいい。

ソリューション1の詳細

の代わりに

SET IDENTITY_INSERT archive_table ON;

INSERT INTO archive_table
  SELECT *
  FROM source_table;

SET IDENTITY_INSERT archive_table OFF;

を書く必要があります。

SET IDENTITY_INSERT archive_table ON;

INSERT INTO archive_table (field1, field2, ...)
  SELECT field1, field2, ...
  FROM source_table;

SET IDENTITY_INSERT archive_table OFF;

field1, field2, ... には、テーブルのすべてのカラムの名前が含まれています。もしカラムのリストを自動生成したいのであれば Daveの回答 または アンドマーさんの回答 .


ソリューション2の詳細

残念ながら、identity int 型のカラムを非identity int 型のカラムに変更すること(quot;type")はできません。基本的には、以下のような選択肢があります。

  • アーカイブテーブルにまだデータがない場合、そのカラムを削除し、IDなしの新しいカラムを追加します。

または

  • SQL Server Management Studio を使用して Identity Specification / (Is Identity) プロパティを、アーカイブ・テーブルの ID カラムの No . 裏側では、テーブルを再作成して既存のデータをコピーするスクリプトが作成されるので、そのために Tools / Options / Designers / Table and Database Designers / Prevent saving changes that require table re-creation .

または