Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come inserire valori in una colonna IDENTITY in SQL Server

Se hai mai provato a inserire valori in una colonna di identità in SQL Server, potresti aver visualizzato un errore come questo:

Impossibile inserire un valore esplicito per la colonna Identity nella tabella "Artisti" quando IDENTITY_INSERT è impostato su OFF.

E 'normale. Una colonna di identità è presente per un motivo. Popola automaticamente la colonna con un valore incrementale per ogni riga inserita. Pertanto non è necessario che tu inserisca un valore in quella colonna.

Tuttavia, a volte lo fai è necessario inserire un valore in una colonna di identità. Ad esempio, potresti popolare il database con dati che devono mantenere i propri valori di identità. In questo caso, dovrai sovrascrivere IDENTITY proprietà. Ecco come.

Abilita IDENTITY_INSERT

Puoi sovrascrivere IDENTITY proprietà abilitando IDENTITY_INSERT . Ciò ti consente di inserire i tuoi valori in una colonna di identità.

Ecco un esempio:

SET IDENTITY_INSERT Artists ON;
INSERT INTO Artists (ArtistId, ArtistName, ActiveFrom)   
VALUES 
  (1001, 'AC/DC','1973-01-11'), 
  (1002, 'Allan Holdsworth','1969-01-01'),
  (1003, 'Buddy Rich','1919-01-01');
SET IDENTITY_INSERT Artists OFF;

In questo esempio, la tabella Artists ha una colonna Identity (in questo caso ArtistId è la colonna Identity). Per sovrascrivere IDENTITY proprietà precede semplicemente il INSERT dichiarazione con SET IDENTITY_INSERT Artists ON . Questa istruzione T-SQL ti consente di dire "So che questa tabella ha una colonna Identity ma in questo caso inserisci my valori invece”.

Nota che IDENTITY_INSERT può essere abilitato solo su un tavolo alla volta. Pertanto è una buona idea disabilitare IDENTITY_INSERT subito dopo l'inserto. Questo lo riporta al suo stato originale e ti consente di sovrascrivere una colonna di identità su una tabella diversa, se necessario.

Inoltre, per abilitare IDENTITY_INSERT l'utente deve possedere la tabella o avere ALTER permesso sul tavolo.

Copiare tra tabelle

Abilitazione di IDENTITY_INSERT può anche essere utile quando copi i dati tra le tabelle. Ad esempio, potresti compilare una tabella da un'altra.

Ecco un esempio di copia dei dati dalla tabella Artists alla tabella Artists_Archive:

SET IDENTITY_INSERT Artists_Archive ON;
INSERT INTO Artists_Archive (ArtistId, ArtistName, ActiveFrom)
  SELECT ArtistId, ArtistName, ActiveFrom
	FROM Artists;
SET IDENTITY_INSERT Artists_Archive OFF;

Una cosa da notare è che, se la colonna Identity ha un vincolo di chiave primaria, rifiuterà tutti i valori già esistenti nella tabella di destinazione. Quindi devi essere assolutamente sicuro che l'override della colonna dell'identità sia ciò che vuoi assolutamente fare.