2009-08-12 15 views
7

Ich möchte den gesamten Datensatz aus der Sicherungstabelle foo_bk in Foo-Tabelle ohne spezifische Spalten einfügen.SQL: Einfügen aller Datensätze aus einer Tabelle in eine andere Tabelle ohne die Spalten

, wenn ich diese Abfrage versuchen

INSERT INTO foo 
SELECT * 
FROM foo_bk 

ich werde Fehler „Insert Fehler: Spaltenname oder Anzahl der übergebenen Werte nicht Tabellendefinition.“ Bekommen

Ist es möglich, Masseneinfügung von einer Tabelle zu einer anderen durchzuführen, ohne den Spaltennamen anzugeben? Ich habe es google aber kann nicht scheinen, eine Antwort zu finden. Alle Antworten erfordern spezifische Spalten.

Antwort

2

Sie müssen mindestens die gleiche Anzahl von Spalten haben und jede Spalte muss genau so definiert werden, d. H. Eine varchar-Spalte kann nicht in eine int-Spalte eingefügt werden.

Überprüfen Sie für die Massenübertragung die Dokumentation der von Ihnen verwendeten SQL-Implementierung. Es gibt oft Tools, um Daten von einer Tabelle in eine andere zu übertragen. Für SqlServer 2005 können Sie beispielsweise den Assistenten zum Importieren und Exportieren von SQL Server verwenden. Klicken Sie mit der rechten Maustaste auf die Datenbank, in die Sie Daten verschieben möchten, und klicken Sie auf Exportieren, um darauf zuzugreifen.

1

SQL 2008 können Sie in Ihrer SELECT Spaltennamen verzichten, wenn Sie SELECT INTO verwenden, anstatt INSERT INTO/SELECT:

SELECT * 
INTO Foo 
FROM Bar 
WHERE x=y 

Die INTO Klausel in SQL Server existiert 2000-2005, aber immer noch erfordert Spaltennamen angeben. 2008 scheint die Möglichkeit hinzuzufügen, SELECT * zu verwenden. Weitere Informationen finden Sie in den MSDN-Artikeln zu INTO (SQL2005), (SQL2008).

Die INTO-Klausel funktioniert nur, wenn die Zieltabelle noch nicht existiert. Wenn Sie Datensätze zu einer vorhandenen Tabelle hinzufügen möchten, hilft dies nicht.

+1

Dies ist nur auf einer neuen Tabelle arbeitet wird. – JeffO

+1

INTO funktioniert nicht, wenn die Tabelle bereits existiert. – HLGEM

+0

Und ja, Sie können wählen * in Sql Server 2000 – HLGEM

16

Sie sollten dies nie tun wollen. Wählen Sie * sollte nicht als Basis für eine Einfügung verwendet werden, da die Spalten verschoben werden und Ihre Einfügung unterbrechen können (oder noch schlimmer, nicht Ihre Einfügung, aber Ihre Daten durcheinander bringen. Angenommen, jemand fügt der Tabelle in der Auswahl eine Spalte hinzu, aber nicht die Wenn jemand aus Gründen, die das Verständnis übertreffen, aber häufig vorkommen, beschließt, einen Drop zu erstellen und auf einer Tabelle neu zu erstellen und die Spalten in eine andere Reihenfolge zu verschieben, ist nun Ihr Nachname der Platz, den first_name war in originally und select * wird es in die falsche Spalte in der anderen Tabelle einfügen Es ist eine extrem schlechte Praxis, die Spalten und die spezifische Zuordnung einer Spalte zu der gewünschten Spalte in der Tabelle, an der Sie interessiert sind, nicht zu spezifizieren

Im Moment haben Sie möglicherweise mehrere Probleme, erstens die beiden Strukturen nicht direkt übereinstimmen oder zweitens die Tabelle, die eingefügt wird, hat eine Identität co lumn und so, obwohl die einfügbaren Spalten eine direkte Übereinstimmung sind, hat die Tabelle, in die eingefügt wird, eine weitere Spalte als die andere, und wenn Sie die Datenbank nicht angeben, wird davon ausgegangen, dass Sie versuchen werden, in diese Spalte einzufügen. Oder Sie haben vielleicht die gleiche Anzahl von Spalten, aber eine ist eine Identität und kann daher nicht eingefügt werden (obwohl ich denke, dass das eine andere Fehlermeldung wäre).

10

Per diesem anderen Beitrag: Insert all values of a..., können Sie folgendes tun:

INSERT INTO new_table (Foo, Bar, Fizz, Buzz) 
SELECT Foo, Bar, Fizz, Buzz 
FROM initial_table 

Es ist wichtig, die Spaltennamen angeben, wie sie von den anderen Antworten angegeben.

0

Wie Sie wahrscheinlich von früheren Antworten verstanden haben, können Sie nicht wirklich tun, wonach Sie suchen. Ich denke, dass Sie das Problem verstehen können, das SQL Server mit nicht zu wissen, wie die zusätzlichen/fehlenden Spalten zuordnen.

Das heißt, da Sie erwähnen, dass der Zweck von dem, was Sie hier versuchen, Backup ist, vielleicht können wir mit SQL Server arbeiten und das Problem umgehen. Nicht Ihr genaues Szenario zu wissen, macht es unmöglich, mit einer richtigen Antwort hier zu treffen, aber ich nehme an, die folgend:

  • Sie wünschen, einen Backup/Audit-Prozess für eine Tabelle zu verwalten.
  • Sie haben wahrscheinlich ein paar davon und möchten vermeiden, abhängige Objekte bei jeder Spaltenaddition/-entfernung zu ändern.
  • Die Sicherungstabelle kann zusätzliche Spalten für Überwachungszwecke enthalten.

Ich wünsche Ihnen zwei Möglichkeiten vorschlagen:

Die effiziente Praxis (IMO) für das sein kann Schemaänderungen mit DDL-Trigger zu erkennen und nutzen sie entsprechend der Backup-Tabelle zu ändern. Dadurch können Sie die Methode 'Select * from ...' verwenden, da die Spaltenliste zwischen den beiden Tabellen konsistent ist.

Ich habe diesen Ansatz erfolgreich verwendet und Sie können DDL-Trigger verwenden, um Ihre Auditing-Tabellen automatisch zu verwalten. In meinem Fall habe ich eine Namenskonvention für eine Tabelle verwendet, die Audits erfordert, und der DDL-Trigger hat sie nur im Handumdrehen verwaltet.

Eine andere Option, die für Ihr spezifisches Szenario nützlich sein könnte, besteht darin, eine unterstützende Ansicht für die Tabellen zu erstellen, die die Spaltenliste ausrichten. Hier ist ein kurzes Beispiel:

create table foo (id int, name varchar(50)) 
create table foo_bk (id int, name varchar(50), tagid int) 
go 

create view vw_foo as select id,name from foo 
go 

create view vw_foo_bk as select id,name from foo_bk 
go 

insert into vw_foo 
    select * from vw_foo_bk 
go 

drop view vw_foo 
drop view vw_foo_bk 
drop table foo 
drop table foo_bk 
go 

Ich hoffe, das hilft :)

9

verwenden

SELECT * 
INTO new_table_name 
FROM current_table_name 
+3

Beachten Sie, dass dies nur beim Erstellen einer neuen Tabelle funktioniert. I.E. Es funktioniert wie ein Backup. Das mag aus der Aussage offensichtlich erscheinen, aber ich wollte es wiederholen. Und danke! Es war nützlich :) – Shrout1

+0

Sie müssen in dieser Abfrage nicht erstellen, das zusammen mit Einfügen erstellt auch die neue Tabelle xameeramir

Verwandte Themen