IDENTITY_INSERTがオフに設定されています-オンにする方法は?


111

削除されたファイルのIDを格納する削除済みファイルアーカイブデータベースがあります。管理者がファイルを復元できるようにしたい(ファイルをリンクするための同じIDも同様)。identity_insertを1ずつ増やすとうまくいくので、テーブル全体からidentity_insertを削除したくありません。ストアドTBL_Contentプロシージャへの挿入で、私はこのようなものを持っています

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET IDENTITY_INSERT tbl_content ON
GO

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 
...insert command...
SET IDENTITY_INSERT tbl_content OFF

しかし、私は同じエラーを出し続けます:

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

何か助けは?

回答:


173

代わりに、ストアドプロシージャ内でID挿入をオンに設定する必要がありますか?ストアドプロシージャを変更する場合にのみオンに設定しているようであり、実際に呼び出すときではありません。試してください:

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

16

identity_InsertをONに設定し、レコードを挿入してからオフに戻しませんか?

このような:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET IDENTITY_INSERT tbl_content ON
GO

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 
SET IDENTITY_INSERT tbl_content ON
...insert command...
SET IDENTITY_INSERT tbl_content OFF

14

単一のクエリバッチで実行する必要があると思います。基本的に、GOステートメントはコマンドを複数のバッチに分割しているため、問題が発生しています。これを次のように変更します。

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

1
その通り。これがポイント!挿入の次のコマンドバッチは、SET IDENTITY_INSERT tbl_content ONで始まる必要があります。再びコマンド。
Jettero 2017年

9

リマインダー

SQL Serverでは、1つのテーブルでのみIDENTITY_INSERTプロパティをONに設定できます。

これは動作しません:

SET IDENTITY_INSERT TableA ON
SET IDENTITY_INSERT TableB ON
... INSERT ON TableA ...
... INSERT ON TableB ...
SET IDENTITY_INSERT TableA OFF
SET IDENTITY_INSERT TableB OFF

代わりに:

SET IDENTITY_INSERT TableA ON
... INSERT ON TableA ...
SET IDENTITY_INSERT TableA OFF
SET IDENTITY_INSERT TableB ON
... INSERT ON TableB ...
SET IDENTITY_INSERT TableB OFF



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.