web-dev-qa-db-ja.com

IDENTITY_INSERT ONを明示的に設定し、列リストを使用した後でも、ID挿入エラーが発生するのはなぜですか?

私のコード:

SET IDENTITY_INSERT SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn ON

INSERT INTO SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn
SELECT ColumnWithIdentity, OtherColumnWithoutIdentity, LastColumnInThisTable
FROM ALinkedServer.PrettyCoolDatabaseAsWell.StandardSchema.TableWithIdentityColumn

SET IDENTITY_INSERT SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn OFF

エラー:

メッセージ8101、レベル16、状態1、行4

テーブル 'SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn'のID列の明示的な値は、列リストが使用され、IDENTITY_INSERTがONの場合にのみ指定できます。

何ができますか?

2
J.D.

列リストをコードに追加します。

SET IDENTITY_INSERT SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn ON

INSERT INTO SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn 
    (ColumnWithIdentity, OtherColumnWithoutIdentity, LastColumnInThisTable)
SELECT ColumnWithIdentity, OtherColumnWithoutIdentity, LastColumnInThisTable
FROM ALinkedServer.PrettyCoolDatabaseAsWell.StandardSchema.TableWithIdentityColumn

SET IDENTITY_INSERT SomeCoolDatabase.BoringOldSchema.TableWithIdentityColumn OFF

GO

基本的に、列リストとは、挿入する列を明示的に指定する場合です。

IDENTITY_INSERT ON 、IDである列の値を挿入ステートメントで指定する必要があります(この場合、列ColumnWithIdentity)。 IDENTITY_INSERT OFF、SQL ServerはID列に最初の空き値を設定するため、ColumnWithIdentitySELECT部分にINSERTフィールドを追加しないでください。

7
Cowthulhu