Saya mencoba melakukan kueri ini
INSERT INTO dbo.tbl_A_archive
SELECT *
FROM SERVER0031.DB.dbo.tbl_A
tetapi bahkan setelah saya berlari
set identity_insert dbo.tbl_A_archive on
Saya menerima pesan kesalahan ini
Nilai eksplisit untuk kolom identitas pada tabel 'dbo.tbl_A_archive' hanya dapat ditentukan ketika daftar kolom digunakan dan IDENTITY_INSERT adalah ON.
tbl_A
adalah tabel besar dalam baris dan lebar, yaitu memiliki BANYAK kolom. Saya tidak ingin harus mengetik semua kolom secara manual. Bagaimana saya bisa membuatnya bekerja?
sql-server
jhowe
sumber
sumber
Jawaban:
Ringkasan
SQL Server tidak akan membiarkan Anda memasukkan nilai eksplisit dalam kolom identitas kecuali Anda menggunakan daftar kolom. Dengan demikian, Anda memiliki opsi berikut:
ATAU
tbl_A_archive
biasa, non-identitas : Jika tabel Anda adalah tabel arsip dan Anda selalu menentukan nilai eksplisit untuk kolom identitas, mengapa Anda membutuhkan kolom identitas? Cukup gunakan int biasa saja.Detail tentang Solusi 1
Dari pada
kamu perlu menulis
dengan
field1, field2, ...
berisi nama-nama semua kolom di tabel Anda. Jika Anda ingin membuat-otomatis daftar kolom itu, lihat jawaban Dave atau jawaban Andomar .Detail tentang Solusi 2
Sayangnya, tidak mungkin untuk hanya "mengubah jenis" kolom int identitas ke kolom int identitas. Pada dasarnya, Anda memiliki opsi berikut:
ATAU
Identity Specification
/(Is Identity)
properti kolom identitas di tabel arsip AndaNo
. Di belakang layar, ini akan membuat skrip untuk membuat ulang tabel dan menyalin data yang ada, jadi, untuk melakukan itu, Anda juga harus menghapusTools
/Options
/Designers
/Table and Database Designers
/Prevent saving changes that require table re-creation
.ATAU
sumber
Anda harus membuat daftar kolom untuk pernyataan INSERT Anda:
tidak suka "INSERT Into tableA SELECT ........"
sumber
Jika Anda menggunakan SQL Server Management Studio, Anda tidak perlu mengetik sendiri daftar kolom - cukup klik kanan tabel di Object Explorer dan pilih Script Table sebagai -> SELECT to -> New Query Editor Window .
Jika tidak, maka kueri yang mirip dengan ini akan membantu sebagai titik awal:
sumber
Setuju dengan jawaban Heinzi. Untuk opsi kedua pertama, inilah kueri yang menghasilkan daftar kolom yang dipisahkan koma dalam tabel:
Untuk tabel besar, ini bisa menghemat banyak pekerjaan mengetik :)
sumber
Jika tabel "arsip" dimaksudkan untuk menjadi salinan tepat dari tabel utama Anda maka saya hanya menyarankan agar Anda menghapus fakta bahwa id adalah kolom identitas. Dengan begitu itu akan membiarkan Anda memasukkannya.
Atau Anda dapat mengizinkan dan melarang sisipan identitas untuk tabel dengan pernyataan berikut
Akhirnya, jika Anda membutuhkan kolom identitas untuk berfungsi sebagaimana mestinya maka Anda selalu dapat menjalankan proc yang disimpan.
Ini akan mengembalikan Anda semua kolom dari tabel yang kemudian dapat Anda potong dan tempel ke kueri Anda. (Ini hampir SELALU lebih baik daripada menggunakan *)
sumber
Untuk pernyataan SQL, Anda juga harus menentukan daftar kolom. Untuk misalnya.
dari pada
sumber
Keduanya akan berfungsi, tetapi jika Anda masih mendapatkan kesalahan dengan menggunakan # 1 maka pergi untuk # 2
1)
2)
sumber
Untuk mengisi semua nama kolom ke dalam daftar terbatas koma untuk pernyataan Select untuk solusi yang disebutkan untuk pertanyaan ini, saya menggunakan opsi berikut karena mereka sedikit kurang bertele-tele daripada kebanyakan respons di sini. Meskipun demikian, sebagian besar tanggapan di sini masih dapat diterima dengan sempurna.
1)
2) Ini mungkin pendekatan paling sederhana untuk membuat kolom, jika Anda memiliki SQL Server SSMS.
sumber
Anda harus menentukan nama kolom yang ingin Anda masukkan jika ada kolom Identitas. Jadi perintahnya akan seperti ini di bawah ini:
Jika tabel Anda memiliki banyak kolom maka dapatkan nama kolom tersebut dengan menggunakan perintah ini.
(setelah menghapus koma terakhir (',')) Cukup salin nama kolom lalu.
sumber
Ini seharusnya bekerja. Saya baru saja mengalami masalah Anda:
Sayangnya sepertinya Anda memang perlu daftar kolom termasuk kolom identitas untuk menyisipkan catatan yang menentukan Identitas. Namun , Anda tidak HARUS mendaftar kolom di SELECT. Seperti yang disarankan @Dave Cluderay, ini akan menghasilkan daftar yang diformat untuk Anda salin dan tempel (jika kurang dari 200000 karakter).
Saya menambahkan USE karena saya beralih antar instance.
sumber
Tidak seperti ini
sumber
Cuplikan kode ini menunjukkan cara memasukkan ke dalam tabel saat kolom Kunci Utama identitas AKTIF.
sumber
Karena jika Anda ingin memasukkan nilai-nilai Anda dari satu tabel ke yang lain melalui prosedur tersimpan. Saya menggunakan ini dan ini , yang terakhir yang hampir seperti jawaban Andomar.
sumber
Ada satu atau lebih kolom yang memiliki properti kenaikan-otomatis atau nilai atribut itu akan dihitung sebagai kendala. Anda mencoba mengubah kolom itu.
Ada dua cara untuk menyelesaikannya 1) Sebutkan kolom lain secara eksplisit dan tetapkan hanya nilainya dan PrimaryKey atau nilai kolom kenaikan otomatis akan diatur secara otomatis.
2) Anda dapat mengaktifkan INDENTITY_INSERT kemudian menjalankan permintaan memasukkan Anda akhirnya mematikan IDENTITY_INSERT.
Saran: Ikuti langkah pertama karena ini merupakan pendekatan yang lebih cocok dan efisien.
Untuk informasi lebih lanjut, baca artikel ini di SQL-helper .
sumber
Pastikan bahwa nama kolom, tipe data, dan urutan dalam tabel dari mana Anda memilih catatan sama persis dengan tabel tujuan. Hanya perbedaan yang seharusnya tabel tujuan memiliki kolom identitas sebagai kolom pertama, yang tidak ada di tabel sumber.
Saya menghadapi masalah serupa ketika saya menjalankan "INSERT INTO table_Dest SELECT * FROM table_source_linked_server_excel". Tabel memiliki 115 kolom.
Saya punya dua tabel di mana saya memuat data dari Excel (Sebagai server yang ditautkan) ke dalam tabel dalam database. Dalam tabel database, saya telah menambahkan kolom identitas yang disebut 'id' yang tidak ada di sumber Excel. Untuk satu tabel kueri berjalan dengan sukses dan di lain saya mendapat kesalahan "Nilai eksplisit untuk kolom identitas dalam tabel hanya dapat ditentukan ketika daftar kolom digunakan dan IDENTITY_INSERT adalah ON SQL Server". Ini membingungkan karena skenario persis sama untuk kedua pertanyaan. Jadi saya menyelidiki ini dan apa yang saya temukan adalah bahwa dalam kueri di mana saya mendapatkan kesalahan dengan INSERT INTO .. SELECT *:
Setelah melakukan dua perubahan di atas, kueri untuk INSERT INTO ... SELECT * berhasil dijalankan. Kolom identitas di tabel tujuan menghasilkan nilai identitas untuk setiap baris yang dimasukkan seperti yang diharapkan.
Jadi, meskipun tabel tujuan mungkin memiliki kolom identitas yang tidak ada di tabel sumber, INSERT INTO .. SELECT * akan berjalan dengan sukses jika nama, tipe data, dan urutan kolom dalam sumber dan tujuan sama persis.
Semoga ini bisa membantu seseorang.
sumber
Saya pikir kesalahan ini terjadi karena ketidakcocokan dengan jumlah kolom dalam definisi tabel dan jumlah kolom dalam permintaan memasukkan. Panjang kolom juga dihilangkan dengan nilai yang dimasukkan. Jadi cukup tinjau definisi tabel untuk menyelesaikan masalah ini
sumber