2017-03-21 2 views
0

Ich nehme einige Zeilen aus einer Tabelle, manipuliere sie in einer temporären Tabelle und suche dann, sie als neue Zeilen in meine ursprüngliche Tabelle einzufügen.Einfügen aus einer temporären Tabelle in eine Tabelle mit Identitätsspalte

Ich habe jedoch ein Problem mit der Identitätsspalte, auch wenn ich nicht die Identitätsspalte auf meiner temporären Tabelle habe. Die Identitätsspalte ist ein automatisch inkrementierender Int.

Dies scheint wie eine einfache Sache, die ich übermäßig denke.

select top 0 * 
into #TestTable 
from OriginalTable; 

... 
--insert and manipulate records 
... 

ALTER TABLE #TestTable 
DROP COLUMN MyIdentityColumn; 

DECLARE @InsertedRows TABLE (NewSeqNum INT); 

INSERT INTO OriginalTable 
OUTPUT MyIdentityColumn INTO @InsertedRows(NewSeqNum) 
SELECT * FROM #TestTable 

aber ich bekomme diese Fehlermeldung:

An explicit value for the identity column in table 'OriginalTable' can only be specified when a column list is used and IDENTITY_INSERT is ON.

ich absolut nicht wollen, einen expliziten Wert setzen, ich habe es mir die neue Identität einfügen möchten, und geben (über @InsertedRows)

+1

Verwenden Sie nicht * als Werte. Sie müssen die Spalten explizit angeben. In Ihrem Fall schlägt dies fehl, da der Parser nicht jeden Schritt logisch bewertet. Es denkt immer noch, dass MyIdentityColumn eine Spalte von #TestTable ist und denkt, dass Sie versuchen, es einzufügen. Sei explizit in deinem Code. Geben Sie die Spalten in der INSERT-Anweisung UND in der Select-Anweisung an, die Sie für die Werte verwenden. –

+0

@SeanLange gibt es eine dynamische Möglichkeit, das zu tun? Kann ich die Spaltennamen aus dem Schema ohne die Ident-Spalte auswählen und diese anstelle von "*" verwenden, oder bin ich buchstäblich dabei, sie alle aufzulisten? –

+2

Sie sollten IMMER die Spalten auflisten. Wenn es sich um eine große Anzahl von Spalten handelt, können Sie den Spalten- "Ordner" in SSMS in ein Abfragefenster ziehen. Alles andere als die Spalte, die explizit aufgelistet ist, ist faul und anfällig für Fehler auf der Straße, wenn sich die Tabelle ändert. –

Antwort

2

Wenn Sie die ID der eingefügten Datensätze nicht beibehalten möchten, müssen Sie alle Spalten außer der ID-Spalte in der Auswahl angeben. Als allgemeine empfehlenswerte Vorgehensweise wählen Sie nicht *, geben Sie immer die Spalten an, die Sie abrufen möchten.

INSERT INTO OriginalTable (col1, col2, col3...) 
OUTPUT MyIdentityColumn INTO @InsertedRows(NewSeqNum) 
SELECT (col1, col2, col3...) FROM #TestTable 
1

Wenn ich Sie verstehen, ich glaube, Ihr Problem ist, dass Sie versuchen, einzufügen ‚*‘ in der ursprünglichen Tabelle - die alle Ihrer Spalten aus der temporären Tabelle bedeutet. Einschließlich Ihrer ID-Spalte (die Sie nicht wollen, einfügen, weil Sie es wollen, sind zu automatisch generieren.)

Stattdessen würde ich vorschlagen, so etwas wie dies zu tun:

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your temp table 

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your original table. 

.. aka, buchstabieren Sie die Spalten explizit, und lassen Sie die Identity-Spalte weg.

Verwandte Themen