SET IDENTITY_INSERT (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'de Azure Synapse AnalyticsSQL veritabanı

Bu ifadeyi kullanarak, bir tablonun sütununa açık değerler IDENTITY ekleyebilirsiniz.

Bu makale ve sözdizimiIDENTITY, SQL Database Engine'in farklı platformlarında farklılık gösterir. Microsoft Fabric Data Warehouse için, sürüm açılır menüsünden Fabric Data Warehouse seçeneğini seçin.

Transact-SQL söz dizimi kuralları

Sözdizimi

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

Bağımsız değişken

database_name

Belirtilen tablonun bulunduğu veritabanının adı.

schema_name

Tabloyu içeren şemanın adı.

table_name

Kimlik sütunu olan bir tablonun adı.

Açıklamalar

Herhangi bir zamanda, oturumdaki yalnızca bir tabloda IDENTITY_INSERT özelliği ONolarak ayarlanabilir. Eğer bir tabloda bu özellik ONzaten , olarak ayarlanmışsa ve başka bir tablo için bir SET IDENTITY_INSERT ON ifade çıkarırsanız, SQL Server zaten 'olduğunu SET IDENTITY_INSERTbelirten bir hata mesajı ON verir ve hangi tablonun ON ayarlandığını bildirir.

  • IDENTITY argümanı pozitif olduğunda ve eklenen değer tablonun mevcut kimlik değerinden büyük olduğunda, SQL Database Engine otomatik olarak yeni eklenen değeri mevcut kimlik değeri olarak kullanır.
  • increment FonksiyonunIDENTITY argümanı negatif olduğunda ve eklenen değer tablonun mevcut kimlik değerinden küçükse, SQL Server otomatik olarak yeni eklenen değeri mevcut kimlik değeri olarak kullanır.

SET IDENTITY_INSERT ayarı ayrıştırma zamanında değil yürütme veya çalışma zamanında ayarlanır.

İzinler

Masaya sahip olmalısın ya da masada izin almalısın ALTER .

Örnekler

Aşağıdaki örnek, kimlik sütunu içeren bir tablo oluşturur ve SET IDENTITY_INSERT ayarının, DELETE deyiminin neden olduğu kimlik değerlerindeki boşluğu doldurmak için nasıl kullanılabileceğini gösterir.

USE AdventureWorks2022;
GO

Araç tablosu oluşturma.

CREATE TABLE dbo.Tool
(
    ID INT IDENTITY NOT NULL PRIMARY KEY,
    Name VARCHAR (40) NOT NULL
);
GO

Ürünler tablosuna değer ekleyin.

INSERT INTO dbo.Tool (Name)
VALUES ('Screwdriver'),
    ('Hammer'),
    ('Saw'),
    ('Shovel');
GO

Kimlik değerlerinde boşluk oluşturun.

DELETE dbo.Tool
WHERE Name = 'Saw';
GO

SELECT *
FROM dbo.Tool;
GO

3 açık kimlik değeri eklemeyi deneyin.

INSERT INTO dbo.Tool (ID, Name)
VALUES (3, 'Garden shovel');
GO

Önceki INSERT kod aşağıdaki hatayı döndürür:

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.

IDENTITY_INSERT ONolarak ayarlayın.

SET IDENTITY_INSERT dbo.Tool ON;
GO

3 açık kimlik değeri eklemeyi deneyin.

INSERT INTO dbo.Tool (ID, Name)
VALUES (3, 'Garden shovel');
GO

SELECT *
FROM dbo.Tool;
GO

Araç tablosunu bırakma.

DROP TABLE dbo.Tool;
GO

Şunlar için geçerlidir:Microsoft Fabric'te Ambar

Fabric Data Warehouse'de bir tablonun sütununa açık değerler IDENTITY eklemek için kullanılırSET IDENTITY_INSERT. SET IDENTITY_INSERT Kimlik sütununa belirli değerler eklemeniz gerektiğinde kullanın; örneğin veri taşını, felaket kurtarma sırasında veya boyut tablolarında sentinel değerleri doldururken.

Transact-SQL söz dizimi kuralları

Sözdizimi

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

Bağımsız değişken

schema_name

Tabloyu içeren şemanın adı.

table_name

Kimlik sütunu olan bir tablonun adı.

Açıklamalar

Herhangi bir zamanda, oturumdaki yalnızca bir tabloda IDENTITY_INSERT özelliği ONolarak ayarlanabilir. Eğer bir tabloda bu özellik ON zaten ayarlanmışsa ve başka bir tablo için veriyorsanız SET IDENTITY_INSERT ON , bir hata özelliğin zaten ayarlandığı tabloyu belirler.

Açık eklemeleri tamamladıktan sonra, IDENTITY_INSERTOFF kimlik aralığını yeniden hizalamak ve gelecekteki otomatik olarak oluşturulan değerlerle olası çatışmaları önlemek için DBCC CHECKIDENT ile RESEED çalıştırın.

Fabric Data Warehouse, kullanıldığında kimlik değerlerinin IDENTITY_INSERT benzersizliğini garanti etmez. Açıkça eklenen değerler, sistem daha fazla değer üretmeden önce kimlik meta verilerini yeniden hizalamak için çalışmazsanız DBCC CHECKIDENT , tekrarlar oluşturabilir.

İzinler

Masaya sahip olmalısın ya da masada izin almalısın ALTER .

Limitations

SET IDENTITY_INSERT Sadece INSERT ve COPY INTO ifadeleri için geçerlidir. Mevcut kimlik sütunu değerlerini güncellemenize izin vermiyor.

Örnekler

A. Sentinel değerlerini boyut tablosuna ekleyin

En IDENTITY_INSERT yaygın kullanım, veri deposu kurulumu veya taşınma sırasında boyut tablolarında "Bilinmeyen" gibi sentinel değerlerin -1 doldurulmasıdır.

-- Create a dimension table with an IDENTITY column
CREATE TABLE dbo.DimCustomer (
    CustomerKey BIGINT IDENTITY,
    CustomerName VARCHAR(100),
    Email VARCHAR(200)
);

-- Enable IDENTITY_INSERT to add sentinel rows
SET IDENTITY_INSERT dbo.DimCustomer ON;

INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName, Email)
VALUES (-1, 'Unknown', 'N/A');

INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName, Email)
VALUES (-2, 'Not Applicable', 'N/A');

SET IDENTITY_INSERT dbo.DimCustomer OFF;

-- Reseed to prevent conflicts with future auto-generated values
DBCC CHECKIDENT('dbo.DimCustomer', RESEED);

B. Mevcut kimlik değerlerini koruyarak veri taşın

SQL Server veya Azure Synapse Analytics'ten geçiş yaparken, mevcut kimlik değerlerini korumak ve referans bütünlüğünü korumak için kullanınIDENTITY_INSERT.

-- Assume dbo.DimProduct has an IDENTITY column named ProductKey
SET IDENTITY_INSERT dbo.DimProduct ON;

INSERT INTO dbo.DimProduct (ProductKey, ProductName, Category, ListPrice)
VALUES (1, 'Widget A', 'Hardware', 19.99),
       (2, 'Widget B', 'Hardware', 29.99),
       (3, 'Gadget C', 'Electronics', 49.99);

SET IDENTITY_INSERT dbo.DimProduct OFF;

-- Reseed after migration
DBCC CHECKIDENT('dbo.DimProduct', RESEED);

C. Kimlik değerlerindeki boşluğu doldurun

Bir tablodan satırlar silinirse, gerektiğinde kimlik dizisindeki boşlukları doldurmak için kullanın IDENTITY_INSERT .

CREATE TABLE dbo.Tool (
    ID BIGINT IDENTITY,
    Name VARCHAR(40) NOT NULL
);

INSERT INTO dbo.Tool (Name)
VALUES ('Screwdriver'), ('Hammer'), ('Saw'), ('Shovel');

-- Delete a row, creating a gap
DELETE FROM dbo.Tool WHERE Name = 'Saw';

-- Fill the gap with an explicit value
SET IDENTITY_INSERT dbo.Tool ON;

INSERT INTO dbo.Tool (ID, Name)
VALUES (3, 'Garden shovel');

SET IDENTITY_INSERT dbo.Tool OFF;
DBCC CHECKIDENT('dbo.Tool', RESEED);

D. KOPYA İÇERİ ile açık değerler ekleyin

Bu ifade COPY INTO , komut içinde açık değerleri alma seçeneğini destekler IDENTITY_INSERT . COPY INTO Seçenekler, için IDENTITY_INSERTherhangi bir oturum seviyesi ayarı geçersiz kalır.

COPY INTO dbo.Employees (EmployeeID 1, FirstName 2, LastName 3)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    IDENTITY_INSERT = 'ON'
);