Anda dapat menggunakan gabungan untuk membuat dan mengisi tabel baru dalam sekali jalan:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
Karena 1 = 0
kondisinya, sisi kanan tidak akan memiliki kecocokan dan dengan demikian mencegah duplikasi baris sisi kiri, dan karena ini adalah sambungan luar, baris sisi kiri tidak akan dihilangkan juga. Akhirnya, karena ini adalah gabungan, properti IDENTITY dihilangkan.
Memilih hanya kolom sisi kiri, oleh karena itu, akan menghasilkan salinan tepat dbo.TableWithIdentity hanya data-bijaksana, yaitu dengan properti IDENTITY dilucuti.
Semua yang dikatakan, Max Vernon telah mengangkat poin yang valid dalam komentar yang patut diingat. Jika Anda melihat rencana eksekusi permintaan di atas:
Anda akan melihat bahwa tabel sumber disebutkan dalam rencana eksekusi sekali saja. Contoh lain telah dihilangkan oleh pengoptimal.
Jadi, jika pengoptimal dapat menetapkan dengan benar bahwa sisi kanan gabungan tidak diperlukan dalam paket, harus masuk akal untuk mengharapkan bahwa dalam versi SQL Server yang akan datang mungkin dapat mengetahui bahwa properti IDENTITY tidak perlu dihapus juga, karena tidak ada lagi kolom IDENTITAS di baris sumber yang diatur sesuai dengan rencana kueri. Itu berarti bahwa permintaan di atas mungkin berhenti berfungsi seperti yang diharapkan di beberapa titik.
Tetapi, sebagaimana dicatat dengan benar oleh ypercubeᵀᴹ , sejauh ini manual secara eksplisit menyatakan bahwa jika ada gabungan, properti IDENTITY tidak dilindungi:
Ketika kolom identitas yang ada dipilih ke tabel baru, kolom baru mewarisi properti IDENTITY, kecuali [...] [t] ia SELECT pernyataan berisi gabungan.
Jadi, selama manual terus menyebutkannya, kita mungkin dapat yakin bahwa perilakunya akan tetap sama.
Kudos to Shaneis dan ypercubeᵀᴹ untuk memunculkan topik terkait dalam obrolan.
JOIN (SELECT 1) AS dummy ON 1 = 1
berhasil juga?CROSS JOIN (SELECT 1)
,INNER JOIN (SELECT 1) ON 1=1
,LEFT JOIN (SELECT 1) ON 1=0
AtauON 1=1
- tidak ada strip IDENTITAS. Sepertinya itu harus berupa objek yang dideklarasikan atau dibuat .Coba kode ini ..
The
ISNULL
panggilan memastikan bahwa kolom baru dibuat denganNOT NULL
nullability.sumber
ISNULL()
atau+0
yang melakukannya? Atau keduanya dibutuhkan?Hanya untuk menunjukkan cara yang berbeda:
Anda dapat menggunakan server tertaut .
Anda dapat membuat sementara server yang tertaut ke server lokal menggunakan ini:
Di titik mana, Anda akan menjalankan
select * into
kode, merujuklocalserver
server empat-nama-nama yang ditautkan:Setelah itu selesai, bersihkan
localserver
server yang ditautkan dengan ini:Atau, Anda bisa menggunakan
OPENQUERY
sintakssumber
Properti identitas tidak ditransfer jika pernyataan pilih berisi gabungan, dan sebagainya
juga akan memberikan perilaku yang diinginkan (dari
id
kolom yang disalin untuk tidak menyimpanIDENTITY
properti. Namun, itu akan memiliki efek samping dari tidak menyalin baris sama sekali! (seperti dengan beberapa metode lain) sehingga Anda perlu melakukan:(terima kasih AakashM!)
sumber
Cara mudah adalah membuat bagian kolom dari ekspresi.
Contoh:
Jika tabel dbo.Employee memiliki identitas pada kolom ID maka dalam contoh di bawah ini tabel temp #t akan memiliki IDENTITAS pada kolom ID juga.
Ubah ini untuk menerapkan ekspresi pada ID dan Anda tidak akan lagi memiliki IDENTITAS pada kolom ID. Dalam hal ini kami menerapkan tambahan sederhana ke kolom ID.
Contoh lain dari ekspresi untuk tipe data lain dapat meliputi: convert (), string concatenation, atau Isnull ()
sumber
Terkadang, Anda ingin menyisipkan dari tabel di mana Anda tidak tahu (atau peduli) apakah kolom itu dibuat menggunakan IDENTITY atau tidak. Bahkan mungkin bukan kolom bilangan bulat yang sedang Anda kerjakan. Dalam hal ini, berikut ini akan berfungsi:
ISNULL akan menjatuhkan atribut IDENTITY dari kolom tetapi menyisipkannya dengan nama dan jenis yang sama dengan kolom asli dan juga membuatnya tidak nullable. TOP (0) akan membuat tabel kosong yang bisa Anda gunakan untuk menyisipkan baris yang dipilih. Anda juga dapat membuat tabel dikompresi sebelum Anda memasukkan data jika diperlukan.
sumber
akan menghapus identitas.
Downsidenya
id
menjadi nullable tetapi Anda bisa menambahkan batasan itu.sumber
Kamu tidak.
select * into
mempertahankan identitas.sumber
*
.identity
properti tidak selalu dilestarikan, seperti yang ditunjukkan oleh jawaban lain.