Come attivare e disattivare IDENTITY_INSERT utilizzando SQL Server 2008?


461

Perché viene visualizzato un errore durante l'inserimento quando IDENTITY_INSERTè impostato su OFF?

Come si accende correttamente in SQL Server 2008? Usando SQL Server Management Studio?

Ho eseguito questa query:

SET IDENTITY_INSERT Database. dbo. Baskets ON

Quindi ho ricevuto di nuovo il messaggio nella console che i comandi sono stati completati correttamente. Tuttavia, quando eseguo l'applicazione, mi dà ancora l'errore mostrato di seguito:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

Espandi questa domanda in modo che possiamo capire cosa stai cercando di fare. Quale affermazione stai eseguendo quando riscontri questo errore e qual è il testo effettivo del messaggio di errore?
Matt Gibson,

Anche se hai fatto un'altra domanda, dovresti accettare una risposta qui: abbiamo risposto a quello che hai chiesto .
gbn,

8
Ho un orrore dell'idea che qualcuno stia cercando di inviare valori di identità da un'applicazione. Questo non è qualcosa che dovresti fare, tranne per la rara migrazione dei dati. Se lo stai facendo abbastanza regolarmente per eseguirlo da un'applicazione, probabilmente dovrai rivisitare il design della tabella.
HLGEM,

Sto usando questo nel mio backup con script SQL. Durante il ripristino, mi consente di caricare i dati in una tabella con incremento automatico con valori originali. Il backup con script mi ​​ha permesso di effettuare il downgrade del database SQL. La realizzazione del backup con script da parte di Management Studio rende lo script non caricabile se conservo i dati binari in un campo di testo.
Jettero

Risposte:


771

Tramite SQL come da MSDN

SET IDENTITY_INSERT sometableWithIdentity ON

INSERT INTO sometableWithIdentity 
    (IdentityColumn, col2, col3, ...)
VALUES 
    (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF

Il messaggio di errore completo indica esattamente cosa non va ...

Impossibile inserire il valore esplicito per la colonna identità nella tabella "sometableWithIdentity" quando IDENTITY_INSERT è impostato su OFF.


@Beginner: lo sei, quindi l'errore. Come facciamo a sapere che non si desidera inserire valori? Abbiamo solo un messaggio di errore
gbn,

3
L'errore proviene dalla mia app quando eseguo DB.SaveChanges ();
Principiante

5
No, basta interrompere l'invio di un valore per la colonna identità. Oppure impostalo se vuoi nella tua app se vuoi inviare un valore ..... ma allora perché avere una colonna con la proprietà dell'identità impostata per generare valori? Non possiamo decidere per te
gbn

22
@Beginner: l'impostazione è applicabile solo nella sessione corrente (nessuno lo ha sottolineato per questa domanda), quindi l'applicazione dovrebbe accenderla per consentire l'applicazione per eseguire tali inserimenti (ed è probabilmente meglio girare prontamente si spegne di nuovo quando si concludono tali inserti, come gli spettacoli di gbn). Il modo in cui si inseriva un valore nella colonna identità senza rendersene conto non è chiaro, ma forse le versioni precedenti di SQL Server lo includerebbero in modo implicito con tutte le colonne quando non vengono specificate le colonne di inserimento esplicito (?) Come sembra Ismael.
Rob Parker,

2
@Rob, penso che tu abbia punto e non riesco personalmente a riesaminare il codice su qualsiasi codice che non viene inserito senza specificare le colonne. A parte il tempo sprecato per un errore, questa è una pratica rischiosa e puoi finire con seri problemi di integrità dei dati se i dati della colonna non corrispondono correttamente.
HLGEM,

59

Ho avuto un problema in cui non mi permetteva di inserirlo anche dopo aver impostato IDENTITY_INSERT su ON.

Il problema era che non avevo specificato i nomi delle colonne e per qualche motivo non mi piaceva.

INSERT INTO tbl Values(vals)

Quindi, fondamentalmente, esegui l'intero INSERT INTO tbl (cols) Values ​​(vals)


6
non porre domande nel riquadro delle risposte.
Duk,

4
questo era esattamente quello che voleva da me, specificare l'elenco delle colonne (entrambe le colonne sul tavolo, blah)
Maslow,

36

Import: è necessario scrivere colonne INSERTnell'istruzione

INSERT INTO TABLE
SELECT * FROM    

Non è corretto.

Insert into Table(Field1,...)
Select (Field1,...) from TABLE

È corretto


2
Grazie, è stato molto utile
José Romero,

1
Se hai colonne identiche in entrambe le tabelle, puoi fare a meno di elencare le colonne in select (Field1 ..) in questo modo .... Inserisci in Table (Field1, ...) Seleziona * da TABELLA ... e se hai Campo identità da inserire per prima cosa ** SET IDENTITY_INSERT Table_name ON
user3590235

@ user3590235 È un'ipotesi rischiosa che l'elenco delle colonne sia identico. Al di fuori delle domande manuali dell'utente, non farlo mai, perché ti garantisco che un giorno interromperai PROD quando qualcun altro modifica la definizione della tabella senza aggiornare il tuo riferimento.
Elaskanator,

5

So che questo è un thread più vecchio ma mi sono appena imbattuto in questo. Se l'utente sta cercando di eseguire inserti nella colonna Identità dopo un'altra sessione, impostare IDENTITY_INSERT ON, quindi è tenuto a ottenere l'errore sopra riportato.

L'impostazione del valore Inserisci identità e i successivi comandi Inserisci DML devono essere eseguiti dalla stessa sessione.

Qui @Beginner stava impostando Identity Insert ON separatamente e quindi eseguendo gli inserti dalla sua applicazione. Ecco perché ha ottenuto l'errore di seguito:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

0

Ciò è probabile quando hai un campo PRIMARY KEY e stai inserendo un valore che sta duplicando o hai il flag INSERT_IDENTITY impostato su on


0

Sembra necessario mettere un SET IDENTITY_INSERT Database.dbo.Baskets ON;prima di ogni INSERTbatch di invio SQL .

È possibile inviare diversi INSERT ... VALUES ...comandi avviati con una SET IDENTITY_INSERT ... ON;stringa all'inizio. Basta non mettere alcun separatore batch tra.

Non so perché SET IDENTITY_INSERT ... ONsmetta di funzionare dopo il blocco di invio (ad es .: .ExecuteNonQuery()in C #). Ho dovuto rimetterlo SET IDENTITY_INSERT ... ON;all'inizio della prossima stringa di comandi SQL.


forse questo risponde alla tua domanda: stackoverflow.com/questions/5791941/…
Demetris Leptos

0

Un'altra opzione è dove hai tabelle come 'type' o 'status', ad esempio OrderStatus, dove vuoi sempre controllare il valore Id, creare la colonna Id (chiave primaria) senza che sia una colonna Identity è il primo posto.


-1

È necessario aggiungere il comando 'go' dopo aver impostato l'inserimento dell'identità. Esempio:

SET IDENTITY_INSERT sometableWithIdentity ON
go

INSERT sometableWithIdentity (IdentityColumn, col2, col3, ...)
VALUES (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF
go

5
Questa domanda ha quattro anni e ha una risposta accettata. La tua risposta duplica la risposta accettata
Ghost

13
Bene, non una duplicazione esatta - ha incluso i comandi "go" ...;)
RoastBeast
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.