Jak włączać i wyłączać IDENTITY_INSERT za pomocą SQL Server 2008?


461

Dlaczego pojawia się błąd podczas wstawiania, gdy IDENTITY_INSERTjest ustawiony na WYŁ?

Jak włączyć go poprawnie w SQL Server 2008? Czy to za pomocą SQL Server Management Studio?

Uruchomiłem to zapytanie:

SET IDENTITY_INSERT Database. dbo. Baskets ON

Potem dostałem z powrotem komunikat w konsoli, że polecenia zostały pomyślnie wykonane. Jednak po uruchomieniu aplikacji nadal pojawia się błąd pokazany poniżej:

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

Rozwiń to pytanie, abyśmy mogli zrozumieć, co próbujesz zrobić. Jakie stwierdzenie jest wyświetlane po napotkaniu tego błędu i jaki jest rzeczywisty tekst komunikatu o błędzie?
Matt Gibson,

Mimo że zadałeś inne pytanie, tutaj powinieneś zaakceptować odpowiedź: odpowiedzieliśmy na to, o co prosiłeś .
gbn

8
Przeraża mnie myśl, że ktoś próbuje wysłać wartości tożsamości z aplikacji. Nie należy tego robić poza rzadką migracją danych. Jeśli robisz to wystarczająco regularnie, aby uruchamiać go z aplikacji, prawdopodobnie musisz ponownie sprawdzić projekt tabeli.
HLGEM,

Używam tego w mojej kopii zapasowej skryptów SQL. Podczas przywracania pozwól mi załadować dane do tabeli Autoinkrementowanej z oryginalnymi wartościami. Skryptowa kopia zapasowa pozwala mi na obniżenie bazy danych SQL. Realizacja przez Scripted backup w Management Studio powoduje, że skrypt nie można wyładować, jeśli przechowuję dane binarne w polu tekstowym.
Jettero

Odpowiedzi:


771

Przez SQL zgodnie z MSDN

SET IDENTITY_INSERT sometableWithIdentity ON

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

SET IDENTITY_INSERT sometableWithIdentity OFF

Pełny komunikat o błędzie mówi dokładnie, co jest nie tak ...

Nie można wstawić wyraźnej wartości dla kolumny tożsamości w tabeli „SomableWithIdentity”, gdy IDENTITY_INSERT jest ustawiony na OFF.


@ Początkujący: jesteś jednak, stąd błąd. Skąd mamy wiedzieć, że nie chcesz wstawiać wartości? Mamy tylko komunikat o błędzie
gbn

3
Błąd pochodzi z mojej aplikacji, gdy wykonuję DB.SaveChanges ();
Początkujący

5
Nie, po prostu przestań wysyłać wartość dla kolumny tożsamości. Lub ustaw, jeśli chcesz w swojej aplikacji, jeśli chcesz wysłać wartość ..... ale dlaczego masz kolumnę z właściwością tożsamości ustawioną do generowania wartości? Nie możemy zdecydować za Ciebie
gbn

22
@ Początkujący: ustawienie ma zastosowanie tylko w bieżącej sesji (nikt nie zwrócił na to uwagi w tym pytaniu), więc aplikacja musiałaby go włączyć, aby aplikacja mogła wykonywać takie wstawki (i prawdopodobnie najlepiej jest natychmiast włączyć wyłącza się ponownie, gdy takie wstawki są zakończone, jak pokazuje GNB). Sposób wstawiania wartości do kolumny tożsamości, nie zdając sobie sprawy, że nie jest jasne, ale być może starsze wersje programu SQL Server dołączą ją domyślnie do wszystkich kolumn, gdy jawne kolumny wstawiania nie zostaną określone (?), Jak sugeruje Ismael.
Rob Parker

2
@ Rob, myślę, że masz punkt i osobiście nie sprawdzam kodu dowolnego kodu, który wstawia się bez określania kolumn. Oprócz czasu poświęconego na błąd, jest to ryzykowna praktyka i możesz skończyć z poważnymi problemami z integralnością danych, jeśli dane w kolumnie nie będą poprawnie dopasowane.
HLGEM,

59

Miałem problem polegający na tym, że nie pozwalałem na wstawienie go nawet po ustawieniu WŁĄCZENIA IDENTITY_INSERT.

Problem polegał na tym, że nie podałem nazw kolumn i z jakiegoś powodu mi się to nie podobało.

INSERT INTO tbl Values(vals)

Więc w zasadzie wykonaj pełne INSERT INTO tbl (cols) Wartości (vals)


6
nie zadawaj pytań w okienku odpowiedzi.
Duk

4
właśnie tego ode mnie chciał, aby określić listę kolumn (obie kolumny na stole, bla)
Maslow

36

Importuj: musisz wpisać kolumny w INSERTzestawieniu

INSERT INTO TABLE
SELECT * FROM    

Nie jest poprawne.

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

Jest poprawne


2
Dziękuję, to było bardzo pomocne
José Romero

1
Jeśli masz identyczne kolumny w obu tabelach, możesz to zrobić bez wyświetlania kolumn w zaznaczeniu (Pole1 ...) w ten sposób .... Wstaw do tabeli (Pole1, ...) Wybierz * z TABELI ... a jeśli masz Pole tożsamości, które należy wstawić jako pierwsze ** Ustaw IDENTYFIKACJĘ_INSERTA Nazwa_tabeli WŁĄCZONA
3590235

@ user3590235 To ryzykowne założenie, że lista kolumn jest identyczna. Poza ręcznymi zapytaniami użytkowników nigdy tego nie rób, ponieważ gwarantuję, że złamiesz PROD pewnego dnia, gdy ktoś inny zmodyfikuje definicję tabeli bez aktualizacji twojego odniesienia.
Elaskanator

5

Wiem, że to starszy wątek, ale wpadłem na to. Jeśli użytkownik próbuje uruchomić wstawianie w kolumnie Tożsamość po innej sesji Ustaw IDENTITY_INSERT na WŁ., Jest on zobowiązany do otrzymania powyższego błędu.

Ustawienie wartości Wstawianie tożsamości i kolejne polecenia Wstaw DML mają być uruchamiane przez tę samą sesję.

Tutaj @Beginner ustawiał Identity Insert ON osobno, a następnie uruchamiał inserty z jego aplikacji. Dlatego dostał poniższy błąd:

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

0

Jest to prawdopodobne, gdy masz pole KLUCZ PODSTAWOWY i wstawiasz wartość, która się powiela lub masz ustawioną flagę INSERT_IDENTITY na wartość


0

Konieczne wydaje się umieszczenie SET IDENTITY_INSERT Database.dbo.Baskets ON;przed każdą INSERTpartią wysyłającą SQL .

Na początku możesz wysłać kilka INSERT ... VALUES ...poleceń rozpoczętych jednym SET IDENTITY_INSERT ... ON;ciągiem. Po prostu nie umieszczaj żadnego separatora wsadowego pomiędzy.

Nie wiem, dlaczego SET IDENTITY_INSERT ... ONprzestaje działać po bloku wysyłającym (np .: .ExecuteNonQuery()w C #). Musiałem SET IDENTITY_INSERT ... ON;ponownie wpisać na początku następnego ciągu poleceń SQL.


może to odpowiada na twoje pytanie: stackoverflow.com/questions/5791941/...
Demetris Leptos

-1

Musisz dodać polecenie „idź” po ustawieniu wstawiania tożsamości. Przykład:

SET IDENTITY_INSERT sometableWithIdentity ON
go

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

SET IDENTITY_INSERT sometableWithIdentity OFF
go

5
To pytanie ma cztery lata i ma akceptowaną odpowiedź. Twoja odpowiedź powiela zaakceptowaną odpowiedź
Ghost

13
Cóż, nie jest to dokładne powielanie - zawierał polecenia „idź” ...;)
RoastBeast
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.