SET IDENTITY_INSERT (Transact-SQL)

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics

テーブルの ID 列に明示的な値を追加することを許可します。

Transact-SQL 構文表記規則

構文

  
SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name { ON | OFF }  

引数

database_name
指定したテーブルが含まれているデータベースの名前を指定します。

schema_name
テーブルが所属するスキーマの名前を指定します。

table_name
ID 列があるテーブルの名前です。

解説

いかなる場合も、IDENTITY_INSERT プロパティを ON に設定できるのはセッション内の 1 つのテーブルのみです。 1 つのテーブルで既にこのプロパティが ON に設定されている状態で、別のテーブルに対して SET IDENTITY_INSERT ON ステートメントを実行すると、SQL Server では SET IDENTITY_INSERT が既に ON であるというエラー メッセージが返され、このプロパティが ON に設定されているテーブルがレポートされます。

挿入する値がテーブルの現在の ID 値よりも大きい場合、SQL Server では新しく挿入された値が現在の ID 値として自動的に使用されます。

SET IDENTITY_INSERT は、解析時ではなく実行時に設定されます。

アクセス許可

ユーザーはテーブルを所有しているか、テーブルに対する ALTER 権限を持っている必要があります。

次の例では、ID 列を含むテーブルを作成した後、SET IDENTITY_INSERT ステートメントによって ID 値に発生したギャップを、DELETE の設定を使用して調整しています。

USE AdventureWorks2022;  
GO  
-- Create tool table.  
CREATE TABLE dbo.Tool(  
   ID INT IDENTITY NOT NULL PRIMARY KEY,   
   Name VARCHAR(40) NOT NULL  
);  
GO  
-- Inserting values into products table.  
INSERT INTO dbo.Tool(Name)   
VALUES ('Screwdriver')  
        , ('Hammer')  
        , ('Saw')  
        , ('Shovel');  
GO  
  
-- Create a gap in the identity values.  
DELETE dbo.Tool  
WHERE Name = 'Saw';  
GO  
  
SELECT *   
FROM dbo.Tool;  
GO  
  
-- Try to insert an explicit ID value of 3;  
-- should return an error:
-- An explicit value for the identity column in table 'AdventureWorks2022.dbo.Tool' can only be specified when a column list is used and IDENTITY_INSERT is ON.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');  
GO  
-- SET IDENTITY_INSERT to ON.  
SET IDENTITY_INSERT dbo.Tool ON;  
GO  
  
-- Try to insert an explicit ID value of 3.  
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');  
GO  
  
SELECT *   
FROM dbo.Tool;  
GO  
-- Drop tool table.  
DROP TABLE dbo.Tool;  
GO  

参照

CREATE TABLE (Transact-SQL)
IDENTITY (プロパティ) (Transact-SQL)
SCOPE_IDENTITY (Transact-SQL)
INSERT (Transact-SQL)
SET ステートメント (Transact-SQL)