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:
- Einige der Spaltennamen in der Quelltabelle wurden geändert, obwohl die Werte korrekt waren
- Es gab einige zusätzliche Spalten über die tatsächlichen Datenspalten hinaus, die von SELECT * ausgewählt wurden. Ich habe dies mithilfe der Option "Skripttabelle als> Auswählen zu> neues Abfragefenster" in der Excel-Quelltabelle (unter Verbindungsservern) festgestellt. Es gab eine versteckte Spalte direkt nach der letzten Spalte in Excel, obwohl sie keine Daten enthielt. Ich habe diese Spalte in der Excel-Quelltabelle gelöscht und gespeichert.
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.