Vous pouvez utiliser une jointure pour créer et remplir la nouvelle table en une fois:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
En raison de cette 1 = 0
condition, le côté droit n'aura pas de correspondance et empêchera ainsi la duplication des lignes du côté gauche. Comme il s'agit d'une jointure externe, les lignes du côté gauche ne seront pas non plus éliminées. Enfin, puisqu'il s'agit d'une jointure, la propriété IDENTITY est éliminée.
Par conséquent, sélectionner uniquement les colonnes de gauche produira une copie exacte de dbo.TableWithIdentity uniquement en termes de données, c'est-à-dire avec la propriété IDENTITY supprimée.
Cela étant dit, Max Vernon a soulevé un point valable dans un commentaire qu'il convient de garder à l'esprit. Si vous regardez le plan d'exécution de la requête ci-dessus:
vous remarquerez que la table source est mentionnée dans le plan d'exécution une seule fois. L'autre instance a été éliminée par l'optimiseur.
Par conséquent, si l'optimiseur peut établir correctement que le plan ne requiert pas le côté droit de la jointure, il est raisonnable de penser que, dans une future version de SQL Server, il sera peut-être en mesure de déterminer que la propriété IDENTITY n'est pas nécessairement utilisée. supprimé non plus, car il n'y a plus d'autre colonne IDENTITY dans le jeu de lignes source conformément au plan de requête. Cela signifie que la requête ci-dessus risque de ne plus fonctionner comme prévu à un moment donné.
Mais, comme l'a noté correctement ypercubeᵀᴹ , jusqu'à présent, le manuel indique explicitement que s'il existe une jointure, la propriété IDENTITY n'est pas conservée:
Lorsqu'une colonne d'identité existante est sélectionnée dans une nouvelle table, cette nouvelle colonne hérite de la propriété IDENTITY, sauf si [...] [t] e instruction SELECT contient une jointure.
Donc, tant que le manuel ne cesse de le mentionner, nous pouvons probablement être assurés que le comportement restera le même.
Félicitations à Shaneis et à ypercubeᵀᴹ pour avoir abordé un sujet connexe dans le chat.
JOIN (SELECT 1) AS dummy ON 1 = 1
travailler, aussi?