SQL Server 2008 kullanarak IDENTITY_INSERT nasıl açılır ve kapatılır?


461

Neden bir ek yaparken bir hata alıyorum IDENTITY_INSERTKAPALI olarak ayarlandığında neden ?

SQL Server 2008'de düzgün bir şekilde nasıl açabilirim? SQL Server Management Studio kullanarak mı?

Bu sorguyu çalıştırdım:

SET IDENTITY_INSERT Database. dbo. Baskets ON

Sonra Komutların başarıyla tamamlandığı mesajını konsolda geri aldım. Ancak uygulamayı çalıştırdığımda, hala bana aşağıda gösterilen hatayı veriyor:

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

Ne yapmaya çalıştığınızı anlayabilmemiz için lütfen bu soruyu genişletin. Bu hatayla karşılaştığınızda hangi ifade çalıştırıyorsunuz ve hata iletisinin asıl metni nedir?
Matt Gibson

Başka bir soru soruldu olsa da, burada bir cevap kabul etmelidir: Biz cevap size ne sordu .
gbn

8
Birinin bir uygulamadan kimlik değerleri göndermeye çalıştığı fikrinden korkuyorum. Bu, nadiren veri geçişi dışında yapmanız gereken bir şey değildir. Bunu bir uygulamadan çalıştıracak kadar düzenli olarak yapıyorsanız, muhtemelen tablo tasarımınızı tekrar ziyaret etmeniz gerekir.
HLGEM

Bunu SQL komut dosyası yedeklememde kullanıyorum. Geri yükleme sırasında bu, verileri orijinal değerlere sahip Otomatik Büyütülmüş bir tabloya yüklememe izin verir. Komut dosyası yedekleme SQL veritabanını eski sürüme geçirmeme izin veriyor. Bir metin alanında ikili verileri depolarsam Management Studio'nun Komut Dosyası yedeklemesini gerçekleştirmesi yüklenemez komut dosyası oluşturur.
Jettero

Yanıtlar:


771

MSDN başına SQL ile

SET IDENTITY_INSERT sometableWithIdentity ON

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

SET IDENTITY_INSERT sometableWithIdentity OFF

Eksiksiz hata mesajı tam olarak neyin yanlış olduğunu söyler ...

IDENTITY_INSERT KAPALI olarak ayarlandığında 'sometableWithIdentity' tablosuna kimlik sütunu için açık değer eklenemiyor.


@Başlangıç: gerçi, dolayısıyla hata. Size nasıl olduğunu bilmek edilir yok değerlerini eklemek istediğiniz? Sadece bir hata mesajımız var
gbn

3
DB.SaveChanges () yaptığımda hata benim app olduğunu;
Acemi

5
Hayır, kimlik sütunu için bir değer göndermeyi bırakmanız yeterlidir. Veya bir değer göndermek istiyorsanız uygulamanızda isterseniz ayarlayın ..... ancak neden kimlik özelliği olan bir sütun değerleri oluşturmak için ayarlanmış? Sizin için karar veremiyoruz
gbn

22
@Başlangıç: Ayar yalnızca geçerli oturumda uygulanabilir (kimse bu soru için bunu açıkça işaret etmedi), bu nedenle uygulamanın bu tür eklentileri gerçekleştirmesi için uygulamanızın bunu açması gerekir (ve muhtemelen en iyisi hemen gbn gösterileri gibi bu tür ekler tamamlandığında tekrar kapatın). Kimlik sütununa bir değeri ne kadar net olduğunu fark etmeden nasıl eklediğinizi açıklıyoruz, ancak Ismael'ın önerdiği gibi açık ekleme sütunları belirtilmediğinde (?) SQL Server'ın daha eski sürümleri örtük olarak tüm sütunları içerecektir.
Rob Parker

2
@Rob, ben havea noktası adn Ben şahsen sütun belirtmeden na eklemek herhangi bir kod üzerinde kod inceleme başarısız düşünüyorum. Bir hatayı boşa harcayacağınız zamanın yanı sıra, bu riskli bir uygulamadır ve sütun verileri doğru eşleşmezse ciddi veri bütünlüğü sorunlarıyla karşılaşabilirsiniz.
HLGEM

59

IDENTITY_INSERT AÇIK ayarladıktan sonra bile eklememe izin vermedi bir sorun vardı.

Sorun, sütun adlarını belirtmedim ve bazı nedenlerden dolayı hoşlanmadığıydı.

INSERT INTO tbl Values(vals)

Temelde tam INSERT INTO tbl (cols) Değerleri (vals)


6
cevap bölmesinde soru sorma.
Duk

4
tam olarak benden istediğim buydu, sütun listesini belirtmek (masada her iki sütun, falan)
Maslow

36

İçe aktarın: Sen sütunları yazmalısınız INSERTaçıklamada

INSERT INTO TABLE
SELECT * FROM    

Doğru değil.

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

Doğru


2
Teşekkür ederim, bu çok yardımcı oldu
José Romero

1
Her iki tabloda da aynı sütunlar varsa, seçimdeki (Alan1 ..) sütunları böyle listelemeden yapabilirsiniz ... Tabloya Ekle (Alan1, ...) TABLO'dan * seçin ve varsa İlk eklenecek kimlik alanı ** SET IDENTITY_INSERT
Tablo_adı

@ user3590235 Bu, sütun listesinin aynı olduğu riskli bir varsayımdır. Manuel kullanıcı sorgularının dışında bunu asla yapmayın, çünkü referansınızı güncellemeden bir başkası tablo tanımını değiştirdiğinde bir gün PROD'u kıracağınızı garanti ederim.
Elaskanator

5

Bu eski bir iplik olduğunu biliyorum ama ben sadece bu çarptı. Kullanıcı başka bir oturumdan sonra IDENTITY_INSERT ON ayarını yaptıktan sonra Kimlik sütununda ekler çalıştırmaya çalışıyorsa, yukarıdaki hatayı alması gerekir.

Kimlik Ekle değerini ayarlama ve sonraki DML Ekle komutları aynı oturum tarafından çalıştırılacaktır.

@Beginner, Identity Insert özelliğini ayrı olarak ayarlıyor ve eklerini uygulamasından çalıştırıyordu. Bu yüzden aşağıdaki hatayı aldı:

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

0

Bir PRIMARY KEY alanı varsa ve yinelenen bir değer eklediğinizde veya INSERT_IDENTITY bayrağını açık olarak ayarladığınızda bu durum büyük olasılıkla


0

Her SQL'den SET IDENTITY_INSERT Database.dbo.Baskets ON;önce birINSERT gönderme partisinden .

INSERT ... VALUES ...Biriyle başlayan birkaç komut gönderebilirsinizSET IDENTITY_INSERT ... ON;Başlangıçta dizeyle . Sadece herhangi bir toplu ayırıcı koymayın.

SET IDENTITY_INSERT ... ONGönderme bloğundan sonra neden durur çalıştığını bilmiyorum (örneğin: .ExecuteNonQuery()C # için). Bir SET IDENTITY_INSERT ... ON;sonraki SQL komut dizesinin başında tekrar koymak zorunda kaldı .



0

Başka bir seçenek de 'type' veya 'status' gibi tablolarınız olduğu, örneğin her zaman Id değerini kontrol etmek istediğiniz OrderStatus'un bir kimlik sütunu olmadan Kimlik (Birincil Anahtar) sütununu oluşturmasıdır.


-1

Kimlik eklentisini ayarladıktan sonra 'go' komutunu eklemeniz gerekir. Misal:

SET IDENTITY_INSERT sometableWithIdentity ON
go

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

SET IDENTITY_INSERT sometableWithIdentity OFF
go

5
Bu soru dört yaşında ve kabul edilmiş bir cevabı var. Cevabınız kabul edilen cevabı çoğaltır
Ghost

13
Eh, tam bir kopya değil - "git" komutlarını dahil etti ...;)
RoastBeast
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.