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?CROSS JOIN (SELECT 1)
,INNER JOIN (SELECT 1) ON 1=1
,LEFT JOIN (SELECT 1) ON 1=0
OuON 1=1
- aucune dépouille le IDENTITY. On dirait que ce doit être un objet déclaré ou créé .Essayez ce code ..
L'
ISNULL
appel garantit que la nouvelle colonne est créée avec une valeurNOT NULL
NULL.la source
ISNULL()
ou le+0
qui le fait? Ou les deux sont nécessaires?Juste pour montrer une manière différente:
Vous pouvez utiliser un serveur lié .
Vous pouvez créer temporairement un serveur lié au serveur local en utilisant ceci:
A ce stade, vous exécutez le
select * into
code en faisant référence au nomlocalserver
en quatre parties du serveur lié:Une fois cette opération terminée, nettoyez le
localserver
serveur lié avec ceci:Ou, vous pouvez utiliser la
OPENQUERY
syntaxela source
La propriété d'identité n'est pas transférée si l'instruction select contient une jointure, et ainsi de suite.
donnera également le comportement souhaité (de la
id
colonne copiée pour ne pas conserver laIDENTITY
propriété. Cependant, cela aura l’effet secondaire de ne pas copier de ligne du tout!(merci AakashM!)
la source
Le moyen le plus simple consiste à intégrer la colonne à une expression.
Exemple:
si la table dbo.Employee a une colonne identité sur ID, dans l'exemple ci-dessous, table #t aura également une colonne IDENTITY sur ID.
Changez-le pour appliquer une expression à ID et vous n'aurez plus de colonne IDENTITY sur ID. Dans ce cas, nous appliquons un simple ajout à la colonne ID.
D'autres exemples d'expressions pour d'autres types de données pourraient inclure: convert (), concaténation de chaînes ou Isnull ()
la source
Parfois, vous souhaitez insérer à partir d'une table où vous ne savez pas (ou ne vous souciez pas) si la colonne a été créée avec IDENTITY ou non. Il se peut même que vous ne travailliez pas avec une colonne entière. Dans ce cas, ce qui suit fonctionnera:
ISNULL supprimera l'attribut IDENTITY de la colonne mais l'insérera avec le même nom et le même type que la colonne d'origine et le rendra également non nullable. TOP (0) créera une table vide dans laquelle vous pourrez ensuite insérer des lignes sélectionnées. Vous pouvez également compresser la table avant d'insérer des données, si nécessaire.
la source
va supprimer l'identité.
L'inconvénient est que cela
id
devient nul, mais vous pouvez ajouter cette contrainte.la source
Vous ne.
select * into
préserve l'identité.la source
*
.identity
propriété n'est pas toujours préservée, comme le soulignaient d'autres réponses.