SET IDENTITY_INSERT (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analyticssql database v Microsoft Fabric

Použitím tohoto tvrzení můžete vložit explicitní hodnoty do sloupce IDENTITY tabulky.

Tento článek a jeho IDENTITY syntax se liší na různých platformách SQL Database Engine. Pro Microsoft Fabric Data Warehouse vyberte Fabric Data Warehouse v rozbalovacím seznamu verzí.

Transact-SQL konvence syntaxe

Syntax

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

Argumenty

database_name

Název databáze, ve které se daná tabulka nachází.

schema_name

Název schématu, které tabulku obsahuje.

table_name

Název tabulky se sloupcem identity.

Poznámky

Kdykoli může mít vlastnost IDENTITY_INSERT nastavenou na ONpouze jednu tabulku v relaci. Pokud má tabulka tuto vlastnost nastavenou na , ONa vydáte SET IDENTITY_INSERT ON příkaz pro jinou tabulku, SQL Server vrátí chybovou zprávu, která uvádíSET IDENTITY_INSERT, že je již ON, a nahlásí tabulku, pro kterou ON je nastavena.

  • Když increment je argument IDENTITY funkce kladný a vložená hodnota je větší než aktuální hodnota identity tabulky, SQL Database Engine automaticky použije nově vloženou hodnotu jako aktuální hodnotu identity.
  • Když increment je argument IDENTITY funkce záporný a vložená hodnota je menší než aktuální hodnota identity tabulky, SQL Server automaticky použije nově vloženou hodnotu jako aktuální hodnotu identity.

Nastavení SET IDENTITY_INSERT je nastaveno při spuštění nebo spuštění, nikoli v době analýzy.

Dovolení

Musíte vlastnit stůl nebo mít ALTER povolení k jeho umístění.

Příklady

Následující příklad vytvoří tabulku se sloupcem identity a ukazuje, jak se dá nastavení SET IDENTITY_INSERT použít k vyplnění mezery v hodnotách identity způsobených příkazem DELETE.

USE AdventureWorks2022;
GO

Vytvoření tabulky nástrojů

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

Vložte hodnoty do tabulky produktů.

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

Vytvořte mezeru v hodnotách identity.

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

SELECT *
FROM dbo.Tool;
GO

Zkuste vložit explicitní hodnotu ID 3.

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

Předchozí INSERT kód vrací následující chybu:

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.

Nastavte IDENTITY_INSERT na ON.

SET IDENTITY_INSERT dbo.Tool ON;
GO

Zkuste vložit explicitní hodnotu ID 3.

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

SELECT *
FROM dbo.Tool;
GO

Položte stůl na nářadí.

DROP TABLE dbo.Tool;
GO

platí pro:Warehouse v Microsoft Fabric

Použijte SET IDENTITY_INSERT k vložení explicitních hodnot do sloupce IDENTITY tabulky v Fabric Data Warehouse. Použijte SET IDENTITY_INSERT je, když potřebujete vložit konkrétní hodnoty do sloupce identity, například při migraci dat, obnově po havárii nebo při doplňování hodnot sentinel v tabulkách dimenzí.

Transact-SQL konvence syntaxe

Syntax

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

Argumenty

schema_name

Název schématu, které tabulku obsahuje.

table_name

Název tabulky se sloupcem identity.

Poznámky

Kdykoli může mít vlastnost IDENTITY_INSERT nastavenou na ONpouze jednu tabulku v relaci. Pokud má tabulka již nastavenou tuto vlastnost na a ON vydáte pro SET IDENTITY_INSERT ON jinou tabulku, chyba identifikuje tabulku, pro kterou je vlastnost již nastavena.

Po dokončení explicitních vložení se vraťte IDENTITY_INSERT zpět na OFFDBCC CHECKIDENT a spusťte DBCC CHECKIDENT pro RESEED přenastavení rozsahu identity a prevenci možných konfliktů s budoucími automaticky generovanými hodnotami.

Fabric Data Warehouse nezaručuje jedinečnost identitních hodnot, když IDENTITY_INSERT je použita. Explicitně vložené hodnoty mohou zavést duplicity, pokud neprovedete DBCC CHECKIDENT realignment identity metadata dříve, než systém vygeneruje další hodnoty.

Dovolení

Musíte vlastnit stůl nebo mít ALTER povolení k jeho umístění.

Limitations

SET IDENTITY_INSERT platí pouze pro INSERT a COPY INTO výroky. Neumožňuje vám aktualizovat stávající hodnoty sloupců identity.

Příklady

A. Vložte hodnoty sentinelů do tabulky rozměrů

Nejčastějším využitím IDENTITY_INSERT je vyplňování hodnot sentinelů, například -1 pro "Unknown", v tabulkách dimenzí během nastavení nebo migrace datového skladu.

-- 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. Migrovat data při zachování stávajících hodnot identity

Při migraci ze SQL Server nebo Azure Synapse Analytics používejte IDENTITY_INSERT k zachování existujících identitních hodnot a zachování referenční integrity.

-- 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. Vyplňte mezeru v hodnotách identity

Pokud jsou řádky z tabulky odstraněny, použijte IDENTITY_INSERT je k vyplnění mezer v identitní sekvenci, když je to potřeba.

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. Vložte explicitní hodnoty pomocí COPY INTO

Příkaz COPY INTO podporuje IDENTITY_INSERT možnost ingestovat explicitní hodnoty přímo v příkazu. COPY INTO Možnosti přepisují jakékoli nastavení na úrovni relace pro IDENTITY_INSERT.

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'
);