SQL Server-Frage. Wenn du tust
INSERT INTO T1 SELECT (C1, C2) FROM T2
Ich möchte keine Spaltennamen von T1
angeben, da diese mit denen in T2
identisch sind.
Ist das möglich?
Derzeit erhalte ich eine Fehlermeldung
Meldung 213, Ebene 16, Status 1, Zeile 1
Spaltenname oder Anzahl der angegebenen Werte stimmen nicht mit der Tabellendefinition überein.
Wenn T1
und T2
genau übereinstimmen, haben Sie zwei Möglichkeiten. Sie können entweder select
alle Spalten von T2
für den insert into T1
oder der insert
-Anweisung eine Spaltenliste bereitstellen.
Auch wenn Sie eine select
-Anweisung ausführen, enthält MSSQL Spaltenüberschriften, die nicht von einer insert
-Anweisung zum Abgleichen von Spalten verwendet werden.
Verwenden Sie immer explizite Spalten sowohl in der INSERT- als auch in der SELECT-Projektion. Auch wenn Sie nicht möchten, sollten Sie:
INSERT INTO T1 (C1, c2)
SELECT C1, C2 FROM T2
Ja, Sie können die Feldnamen für die Tabelle, in die Sie einfügen, weglassen und mit select * alle Felder aus der Tabelle abrufen. Ich würde diesen Ansatz jedoch nicht empfehlen.
Wenn Sie den Feldnamen weglassen, werden die Felder nach Position und nicht nach Name abgeglichen. Wenn sich die Felder nicht in genau derselben Reihenfolge befinden, werden sie vertauscht. Im Allgemeinen sollten Sie sich nicht auf das genaue Layout der Tabellen verlassen, um das Risiko zu minimieren, dass Änderungen in den Tabellen die Abfragen beschädigen.
Warum nicht einfach
INSERT INTO t1
SELECT * FROM T2
Wählen Sie zuerst diese SQL aus, wählen Sie Ihre Tabellenzeile aus dem SQL-Ergebnis aus und ändern Sie den Ziel- oder Quell-Tabellennamen. Wenn Tabellen dieselben Spalten haben (dieselbe Reihenfolge ist nicht erforderlich), funktioniert dies.
mit xparams als (wähle (wähle Benutzer aus dual) "OWNER", '' "ADDSTRTOFROMTABLENAME" aus dual) , t1 als (SELECT dbat.table_name from dba_tables dbat, xparams where dbat.owner = xparams.OWNER) , t1c1 as (SELECT utcs.table_name, LISTAGG (utcs.column_name, ',') innerhalb der Gruppe (order by utcs.column_name) "COLS" von USER_TAB_COLUMNS utcs, t1 where utcs.table_name = t1.table_name group by utcs.table_name) , res1 as (SELECT 'Einfügen in' || t1c1.table_name || '(' || t1c1.COLS || ') select' || t1c1.COLS || 'from' || t1c1.table_name || xparams.ADDSTRTOFROMTABLENAME || '; "RES" from t1c1, xparams order by t1c1.table_name) select * from res1
Wenn Sie sich Sorgen um Spaltennamen machen, können Sie diese jederzeit als Alias verwenden:
INSERT INTO T1 (C1, c2)
SELECT C1 AS C1_ALIAS, C2 AS C2_ALIAS FROM T2
Oder prägnanter:
INSERT INTO T1 (C1, c2)
SELECT C1 C1_ALIAS, C2 C2_ALIAS FROM T2
Obwohl ich mir nicht wirklich vorstellen kann, warum man das in einem so einfachen Beispiel tun möchte