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?