Ich versuche diese Abfrage zu machen
INSERT INTO dbo.tbl_A_archive
SELECT *
FROM SERVER0031.DB.dbo.tbl_A
aber auch nachdem ich gerannt bin
set identity_insert dbo.tbl_A_archive on
Ich erhalte diese Fehlermeldung
Ein expliziter Wert für die Identitätsspalte in der Tabelle 'dbo.tbl_A_archive' kann nur angegeben werden, wenn eine Spaltenliste verwendet wird und IDENTITY_INSERT aktiviert ist.
tbl_A
ist eine riesige Tabelle in Zeilen und Breite, dh sie hat viele Spalten. Ich möchte nicht alle Spalten manuell eingeben müssen. Wie kann ich das zum Laufen bringen?
sql-server
jhowe
quelle
quelle
Antworten:
Zusammenfassung
Mit SQL Server können Sie keinen expliziten Wert in eine Identitätsspalte einfügen, es sei denn, Sie verwenden eine Spaltenliste. Somit haben Sie folgende Möglichkeiten:
ODER
tbl_A_archive
einer regulären Spalte ohne Identität : Wenn Ihre Tabelle eine Archivtabelle ist und Sie immer einen expliziten Wert für die Identitätsspalte angeben, warum benötigen Sie überhaupt eine Identitätsspalte? Verwenden Sie stattdessen einfach ein reguläres int.Details zu Lösung 1
Anstatt
du musst schreiben
mit
field1, field2, ...
den Namen aller Spalten in Ihren Tabellen. Wenn Sie diese Liste von Spalten automatisch generieren möchten, schauen Sie sich Daves Antwort oder Andomars Antwort an .Details zu Lösung 2
Leider ist es nicht möglich, den Typ einer Identity-Int-Spalte einfach in eine Nicht-Identity-Int-Spalte zu ändern. Grundsätzlich haben Sie folgende Möglichkeiten:
ODER
Identity Specification
/(Is Identity)
der Identitätsspalte in Ihrer Archivtabelle auf festzulegenNo
. Hinter den Kulissen wird dies ein Skript erstellen , um die Tabelle und kopieren Sie vorhandene Daten neu zu erstellen, so, das zu tun, werden Sie auch auf ungesetzt benötigenTools
/Options
/Designers
/Table and Database Designers
/Prevent saving changes that require table re-creation
.ODER
quelle
Sie müssen eine Spaltenliste für Ihre INSERT-Anweisung erstellen:
nicht wie "INSERT Into tableA SELECT ........"
quelle
Wenn Sie SQL Server Management Studio verwenden, müssen Sie die Spaltenliste nicht selbst eingeben. Klicken Sie einfach mit der rechten Maustaste auf die Tabelle im Objekt-Explorer und wählen Sie Skripttabelle als -> AUSWÄHLEN in -> Neues Abfrage-Editor-Fenster .
Wenn dies nicht der Fall ist, sollte eine ähnliche Abfrage als Ausgangspunkt hilfreich sein:
quelle
Stimmen Sie Heinzis Antwort zu. Für die erste zweite Option ist hier eine Abfrage, die eine durch Kommas getrennte Liste von Spalten in einer Tabelle generiert:
Bei großen Tischen kann dies viel Schreibarbeit sparen :)
quelle
Wenn die "Archiv" -Tabelle eine exakte Kopie Ihrer Haupttabelle sein soll, würde ich nur vorschlagen, dass Sie die Tatsache entfernen, dass die ID eine Identitätsspalte ist. Auf diese Weise können Sie sie einfügen.
Alternativ können Sie Identitätseinfügungen für die Tabelle mit der folgenden Anweisung zulassen und nicht zulassen
Wenn die Identitätsspalte unverändert funktionieren soll, können Sie den gespeicherten Prozess jederzeit ausführen.
Dadurch erhalten Sie alle Spalten aus der Tabelle, die Sie dann ausschneiden und in Ihre Abfrage einfügen können. (Dies ist fast IMMER besser als die Verwendung eines *)
quelle
Für die SQL-Anweisung müssen Sie auch die Spaltenliste angeben. Zum Beispiel.
anstatt
quelle
Beides funktioniert, aber wenn Sie mit # 1 immer noch einen Fehler erhalten, wählen Sie # 2
1)
2)
quelle
Um alle Spaltennamen in eine durch Kommas getrennte Liste für eine Select-Anweisung für die für diese Frage genannten Lösungen einzufügen, verwende ich die folgenden Optionen, da sie etwas weniger ausführlich sind als die meisten Antworten hier. Obwohl die meisten Antworten hier immer noch vollkommen akzeptabel sind.
1)
2) Dies ist wahrscheinlich der einfachste Ansatz zum Erstellen von Spalten, wenn Sie über SQL Server SSMS verfügen.
quelle
Sie müssen den Spaltennamen angeben, den Sie einfügen möchten, wenn eine Identitätsspalte vorhanden ist. Der Befehl sieht also wie folgt aus:
Wenn Ihre Tabelle viele Spalten enthält, rufen Sie diesen Spaltennamen mit diesem Befehl ab.
(nach dem Entfernen des letzten Kommas (',')) Kopieren Sie einfach den Namen der letzten Spalte.
quelle
Das sollte funktionieren. Ich bin gerade auf Ihr Problem gestoßen:
Leider scheint es, dass Sie eine Liste der Spalten einschließlich der Identitätsspalte benötigen, um Datensätze einzufügen, die die Identität angeben. Sie MÜSSEN jedoch nicht die Spalten in SELECT auflisten. Wie von @Dave Cluderay vorgeschlagen, führt dies zu einer formatierten Liste, die Sie kopieren und einfügen können (wenn weniger als 200000 Zeichen vorhanden sind).
Ich habe die USE hinzugefügt, da ich zwischen Instanzen wechsle.
quelle
So nicht
quelle
Dieses Codeausschnitt zeigt, wie in eine Tabelle eingefügt wird, wenn die Spalte Identitätsprimärschlüssel aktiviert ist.
quelle
Zum Beispiel, wenn Sie Ihre Werte über eine gespeicherte Prozedur von einer Tabelle in eine andere einfügen möchten. Ich habe dies und das benutzt , letzteres ist fast wie Andomars Antwort.
quelle
Es gibt eine oder mehrere Spalten mit der Eigenschaft zum automatischen Inkrementieren, oder der Wert dieses Attributs wird als Einschränkung berechnet. Sie versuchen, diese Spalte zu ändern.
Es gibt zwei Möglichkeiten, dies zu lösen: 1) Erwähnen Sie andere Spalten explizit und legen Sie nur deren Werte fest. Der Primärschlüssel oder der Spaltenwert für die automatische Inkrementierung werden automatisch festgelegt.
2) Sie können INDENTITY_INSERT aktivieren und dann Ihre Einfügeabfrage ausführen. IDENTITY_INSERT wird schließlich deaktiviert.
Vorschlag: Befolgen Sie den ersten Schritt, da dies ein geeigneterer und effizienter Ansatz ist.
Weitere Informationen finden Sie in diesem Artikel über SQL-Helper .
quelle
Stellen Sie sicher, dass die Spaltennamen, Datentypen und die Reihenfolge in der Tabelle, aus der Sie Datensätze auswählen, genau mit der Zieltabelle übereinstimmen. Der einzige Unterschied sollte sein, dass die Zieltabelle eine Identitätsspalte als erste Spalte hat, die nicht in der Quelltabelle vorhanden ist.
Ich hatte ein ähnliches Problem, als ich "INSERT INTO table_Dest SELECT * FROM table_source_linked_server_excel" ausführte. Die Tabellen hatten 115 Spalten.
Ich hatte zwei solche Tabellen, in denen ich Daten aus Excel (als Verbindungsserver) in Tabellen in der Datenbank lud. In Datenbanktabellen hatte ich eine Identitätsspalte mit dem Namen 'id' hinzugefügt, die im Quell-Excel nicht vorhanden war. Für eine Tabelle wurde die Abfrage erfolgreich ausgeführt und in einer anderen wurde die Fehlermeldung "Ein expliziter Wert für die Identitätsspalte in der Tabelle kann nur angegeben werden, wenn eine Spaltenliste verwendet wird und IDENTITY_INSERT ON SQL Server ist" angezeigt. Dies war rätselhaft, da das Szenario für beide Abfragen genau gleich war. Also habe ich das untersucht und festgestellt, dass in der Abfrage, in der ich einen Fehler mit INSERT INTO .. SELECT * erhalten habe:
Nach den beiden oben genannten Änderungen wurde die Abfrage für INSERT INTO ... SELECT * erfolgreich ausgeführt. Die Identitätsspalte in der Zieltabelle generierte erwartungsgemäß Identitätswerte für jede eingefügte Zeile.
Obwohl die Zieltabelle möglicherweise eine Identitätsspalte enthält, die nicht in der Quelltabelle vorhanden ist, wird INSERT INTO .. SELECT * erfolgreich ausgeführt, wenn die Namen, Datentypen und Spaltenreihenfolgen in Quelle und Ziel genau identisch sind.
Hoffe es hilft jemandem.
quelle
Ich denke, dieser Fehler tritt aufgrund der Nichtübereinstimmung mit der Anzahl der Spalten in der Tabellendefinition und der Anzahl der Spalten in der Einfügeabfrage auf. Auch die Länge der Spalte wird mit dem eingegebenen Wert weggelassen. Überprüfen Sie einfach die Tabellendefinition, um dieses Problem zu beheben
quelle