SQL: Fügen Sie alle Datensätze von einer Tabelle in eine andere Tabelle ohne spezifische Spalten ein

7

Ich möchte den gesamten Datensatz aus der Backup-Tabelle foo_bk in die Foo-Tabelle einfügen, ohne die Spalten anzugeben.

wenn ich diese Abfrage versuche

%Vor%

Ich erhalte den Fehler "Fehler einfügen: Spaltenname oder Anzahl der angegebenen Werte stimmt nicht mit der Tabellendefinition überein."

Ist es möglich, eine Masseninsertion von einer Tabelle in eine andere durchzuführen, ohne den Spaltennamen anzugeben? Ich habe es googlen aber kann keine Antwort finden. Alle Antworten erfordern spezifische Spalten.

    
Jack 12.08.2009, 17:00
quelle

6 Antworten

16

Sie sollten das niemals 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, keine Spalten und die spezifische Zuordnung einer Spalte zu der Spalte anzugeben, die Sie in der Tabelle haben möchten, an der Sie interessiert sind. p>

Momentan haben Sie möglicherweise mehrere Probleme. Erstens stimmen die beiden Strukturen nicht direkt überein oder zweitens hat die Tabelle, in die eingefügt wird, eine Identitätsspalte, und obwohl die einfügbaren Spalten eine direkte Übereinstimmung aufweisen, hat die Tabelle, in die sie eingefügt wird mehr Spalte als die andere und indem Sie die Datenbank nicht angeben, nehmen Sie an, 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).

    
HLGEM 12.08.2009 17:15
quelle
11

Pro diesem anderen Beitrag: Alles einfügen Werte eines ... können Sie Folgendes tun:

%Vor%

Es ist wichtig, die Spaltennamen anzugeben, die von den anderen Antworten angezeigt werden.

    
ragamufin 27.02.2012 09:31
quelle
9

Benutze dies

%Vor%     
nitinuniyal 03.11.2012 09:32
quelle
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.

    
Michael Todd 12.08.2009 17:03
quelle
1

Mit SQL 2008 können Sie auf die Angabe von Spaltennamen in SELECT verzichten, wenn Sie SELECT INTO anstelle von INSERT INTO / SELECT verwenden:

%Vor%

Die INTO -Klausel existiert in SQL Server 2000-2005, erfordert jedoch weiterhin die Angabe von Spaltennamen. 2008 scheint die Möglichkeit hinzuzufügen, SELECT * zu verwenden.

Siehe die MSDN-Artikel zu INTO ( SQL2005 ), (< a href="http://msdn.microsoft.com/en-us/library/ms188029(classic).aspx"> SQL2008 ) für Details.

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

    
Skeolan 12.08.2009 17:11
quelle
0

Wie Sie wahrscheinlich aus 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 zugeordnet werden.

Das heißt, da Sie erwähnen, dass der Zweck dessen, was Sie hier versuchen, Backup ist, können wir vielleicht mit SQL Server arbeiten und das Problem umgehen. Wenn Sie Ihr genaues Szenario nicht kennen, ist es unmöglich, hier eine richtige Antwort zu treffen, aber ich nehme Folgendes an:

  • Sie möchten einen Backup- / Audit-Prozess für eine Tabelle verwalten.
  • Sie haben wahrscheinlich einige davon und möchten vermeiden, abhängige Objekte bei jedem Hinzufügen / Entfernen von Spalten zu ändern.
  • Die Sicherungstabelle kann zusätzliche Spalten für Überwachungszwecke enthalten.

Ich möchte Ihnen zwei Optionen vorschlagen:

Die efficient practice (IMO) hierfür kann darin bestehen, Schemaänderungen mithilfe von DDL-Triggern zu erkennen und sie zu verwenden, um die Sicherungstabelle entsprechend 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 ihn nutzen, damit DDL-Trigger Ihre Auditing-Tabellen automatisch 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 weitere Option, die für Ihr spezifisches Szenario nützlich sein könnte, ist das Erstellen einer unterstützenden Ansicht für die Tabellen, die die Spaltenliste ausrichten. Hier ist ein kurzes Beispiel:

%Vor%

Ich hoffe, das hilft:)

    
itayw 27.02.2012 10:39
quelle

Tags und Links