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?CROSS JOIN (SELECT 1)
,INNER JOIN (SELECT 1) ON 1=1
,LEFT JOIN (SELECT 1) ON 1=0
OderON 1=1
- keine Streifen die Identität. Es scheint, als müsse es sich um ein deklariertes oder erstelltes Objekt handeln .Versuchen Sie diesen Code ..
Der
ISNULL
Aufruf stellt sicher, dass die neue Spalte mitNOT NULL
Nullfähigkeit erstellt wird.quelle
ISNULL()
oder das+0
, was es tut? Oder werden beide benötigt?Nur um einen anderen Weg zu zeigen:
Sie können einen Verbindungsserver verwenden .
Sie können vorübergehend einen Verbindungsserver zum lokalen Server erstellen, indem Sie Folgendes ausführen:
Zu welchem Zeitpunkt würden Sie den
select * into
Code ausführen und auf denlocalserver
vierteiligen Namen des Verbindungsservers verweisen :Bereinigen Sie anschließend den
localserver
Verbindungsserver wie folgt:Oder Sie könnten die
OPENQUERY
Syntax verwendenquelle
Die Identitätseigenschaft wird nicht übertragen, wenn die select-Anweisung einen Join enthält
gibt auch das gewünschte Verhalten (der kopierten
id
Spalte, um dieIDENTITY
Eigenschaft nicht beizubehalten . Es hat jedoch den Nebeneffekt, dass überhaupt keine Zeile kopiert wird! (wie bei einigen anderen Methoden), so dass Sie dann Folgendes tun müssen:(Danke AakashM!)
quelle
Die einfache Möglichkeit besteht darin, die Spalte als Teil eines Ausdrucks zu definieren.
Beispiel:
Wenn die Tabelle dbo.Employee eine Identität in der ID-Spalte hat, hat die temporäre Tabelle #t im folgenden Beispiel auch eine IDENTITY in der ID-Spalte.
Ändern Sie dies, um einen Ausdruck auf ID anzuwenden, und Sie haben keine IDENTITY in der ID-Spalte mehr. In diesem Fall fügen wir der ID-Spalte einen einfachen Zusatz hinzu.
Andere Beispiele für Ausdrücke für andere Datentypen können sein: convert (), string concatenation oder Isnull ()
quelle
Manchmal möchten Sie aus einer Tabelle einfügen, in der Sie nicht wissen (oder sich nicht darum kümmern), ob die Spalte mit IDENTITY erstellt wurde oder nicht. Möglicherweise handelt es sich nicht einmal um eine Ganzzahlspalte, mit der Sie arbeiten. In diesem Fall funktioniert Folgendes:
ISNULL löscht das IDENTITY-Attribut aus der Spalte, fügt es jedoch mit demselben Namen und Typ wie die ursprüngliche Spalte ein und macht es auch nicht nullfähig. TOP (0) erstellt eine leere Tabelle, in die Sie ausgewählte Zeilen einfügen können. Bei Bedarf können Sie die Tabelle auch komprimieren, bevor Sie Daten einfügen.
quelle
wird Identität entfernen.
Der Nachteil ist, dass es
id
nullbar wird, aber Sie können diese Einschränkung hinzufügen.quelle
Das tust du nicht.
select * into
bewahrt die Identität.quelle
*
.identity
Eigentum bleibt nicht immer erhalten, wie andere Antworten zeigten.