webentwicklung-frage-antwort-db.com.de

Spalten in INSERT INTO ... SELECT ... FROM automatisch abgleichen 

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.

12

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.

3
Donnie

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
18
Remus Rusanu

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.

13
Guffa

Warum nicht einfach

INSERT INTO t1
SELECT * FROM T2
2
Sparky

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 
0
ehuehu

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

0
leepowers