È possibile utilizzare un join per creare e popolare la nuova tabella in una sola volta:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
A causa della 1 = 0
condizione, il lato destro non avrà corrispondenze e quindi impedirà la duplicazione delle file del lato sinistro, e poiché si tratta di un join esterno, le file del lato sinistro non verranno eliminate. Infine, poiché si tratta di un join, la proprietà IDENTITY viene eliminata.
Selezionando solo le colonne sul lato sinistro, quindi, verrà prodotta una copia esatta di dbo.TableWithIdentity solo dal punto di vista dei dati, ovvero con la proprietà IDENTITY rimossa.
Detto questo, Max Vernon ha sollevato un punto valido in un commento che vale la pena ricordare. Se guardi il piano di esecuzione della query sopra:
noterai che la tabella di origine è menzionata nel piano di esecuzione solo una volta. L'altra istanza è stata eliminata dall'ottimizzatore.
Quindi, se l'ottimizzatore può stabilire correttamente che il lato destro del join non è necessario nel piano, dovrebbe essere ragionevole aspettarsi che in una versione futura di SQL Server potrebbe essere in grado di capire che la proprietà IDENTITY non deve essere rimosso, poiché non esiste più un'altra colonna IDENTITY nella riga di origine impostata in base al piano di query. Ciò significa che la query sopra potrebbe smettere di funzionare come previsto ad un certo punto.
Ma, come correttamente sottolineato da ypercubeᵀᴹ , finora il manuale ha esplicitamente dichiarato che se esiste un join, la proprietà IDENTITY non viene preservata:
Quando una colonna di identità esistente viene selezionata in una nuova tabella, la nuova colonna eredita la proprietà IDENTITY, a meno che [...] [t] l'istruzione SELECT contenga un join.
Quindi, fintanto che il manuale continuerà a menzionarlo, possiamo essere certi che il comportamento rimarrà lo stesso.
Complimenti a Shaneis e ypercubeᵀᴹ per aver sollevato un argomento correlato nella chat.
JOIN (SELECT 1) AS dummy ON 1 = 1
anche tu?