Sie können einen Join verwenden, um die neue Tabelle auf einmal zu erstellen und aufzufüllen:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
Aufgrund der 1 = 0
Bedingung hat die rechte Seite keine Übereinstimmungen und verhindert somit das Duplizieren der linken Seitenreihen. Da es sich um eine äußere Verknüpfung handelt, werden auch die linken Seitenreihen nicht entfernt. Da es sich um eine Verknüpfung handelt, wird die IDENTITY-Eigenschaft entfernt.
Wenn Sie daher nur die linken Seitenspalten auswählen , wird eine exakte Kopie von dbo.TableWithIdentity nur in Bezug auf die Daten erstellt, dh wenn die IDENTITY-Eigenschaft entfernt ist.
Alles , was gesagt wird, Max Vernon hat einen wichtigen Punkt in einem Kommentar angehoben, die es wert unter Berücksichtigung ist. Wenn Sie sich den Ausführungsplan der obigen Abfrage ansehen:
Sie werden feststellen, dass die Quelltabelle nur einmal im Ausführungsplan erwähnt wird. Die andere Instanz wurde vom Optimierer entfernt.
Wenn das Optimierungsprogramm also korrekt feststellen kann, dass die rechte Seite des Joins im Plan nicht benötigt wird, sollte zu erwarten sein, dass es in einer zukünftigen Version von SQL Server möglicherweise möglich ist, herauszufinden, dass die IDENTITY-Eigenschaft nicht benötigt wird entfernt, da in der Quellzeile keine weitere IDENTITY-Spalte mehr vorhanden ist, die dem Abfrageplan entspricht. Das bedeutet, dass die obige Abfrage möglicherweise irgendwann nicht mehr wie erwartet funktioniert.
Aber, wie von ypercubeᵀᴹ richtig bemerkt , hat das Handbuch bisher explizit angegeben, dass die IDENTITY-Eigenschaft bei einem Join nicht beibehalten wird:
Wenn eine vorhandene Identitätsspalte in einer neuen Tabelle ausgewählt wird, übernimmt die neue Spalte die IDENTITY-Eigenschaft, es sei denn, die SELECT-Anweisung enthält einen Join.
So lange das Handbuch dies erwähnt, können wir uns wahrscheinlich darauf verlassen, dass das Verhalten gleich bleibt.
Ein großes Lob an Shaneis und ypercubeᵀᴹ , die im Chat ein verwandtes Thema angesprochen haben .
JOIN (SELECT 1) AS dummy ON 1 = 1
funktionieren?