it-swarm.com.de

SQL: Fügen Sie alle Datensätze aus einer Tabelle in eine andere Tabelle ein, ohne die Spalten zu spezifizieren

Ich möchte den gesamten Datensatz aus der Sicherungstabelle foo_bk in die Tabelle foo einfügen, ohne die Spalten zu spezifizieren.

wenn ich diese Frage versuche

INSERT INTO foo 
SELECT *
FROM foo_bk

ich erhalte die Fehlermeldung "Insert Error: Spaltenname oder Anzahl der angegebenen Werte stimmen nicht mit der Tabellendefinition überein."

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

7
Jack

Das solltest du nie wollen. Select * sollte nicht als Basis für eine Einfügung verwendet werden, da die Spalten möglicherweise verschoben werden und Ihre Einfügung beschädigen (oder schlimmer noch, Ihre Einfügung nicht beschädigen, sondern Ihre Daten durcheinander bringen) Bei einer anderen Tabelle wird der Code beschädigt. Oder es wird angenommen, dass jemand aus Gründen, die das Verständnis übertreffen, aber häufig vorkommen, beschließt, eine Tabelle zu löschen und neu zu erstellen und die Spalten in eine andere Reihenfolge zu verschieben. Nun ist Ihr Nachname der Ort, an dem Vorname war In Original und Select * wird es in die falsche Spalte in der anderen Tabelle gestellt. Es ist eine äußerst schlechte Praxis, Spalten und die spezifische Zuordnung einer Spalte zu der Spalte, die Sie in der Tabelle haben möchten, für die Sie sich interessieren, nicht anzugeben.

Im Moment 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. Obwohl die einfügbaren Spalten direkt übereinstimmen, hat die Tabelle, in die eingefügt wird, eine Spalte mehr als Bei der anderen Option und wenn Sie die Datenbank nicht angeben, wird davon ausgegangen, dass Sie versuchen, sie in diese Spalte einzufügen. Oder Sie haben möglicherweise die gleiche Anzahl von Spalten, aber eine ist eine Identität und kann daher nicht eingefügt werden (obwohl ich denke, dass dies eine andere Fehlermeldung wäre).

16
HLGEM

In diesem anderen Beitrag: Fügen Sie alle Werte eines ... ein. Sie können Folgendes tun:

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

Es ist wichtig, die Spaltennamen wie in den anderen Antworten angegeben anzugeben.

11
ragamufin

Benutze das

SELECT *
INTO new_table_name
FROM current_table_name
9
nitinuniyal

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

Informationen zur Massenübertragung finden Sie in der Dokumentation der von Ihnen verwendeten SQL-Implementierung. Es stehen häufig Tools zur Verfügung, mit denen Daten von einer Tabelle in eine andere übertragen werden können. Für SqlServer 2005 können Sie beispielsweise den SQL Server-Import- und -Export-Assistenten verwenden. Klicken Sie mit der rechten Maustaste auf die Datenbank, in der Sie Daten verschieben möchten, und klicken Sie auf Exportieren, um darauf zuzugreifen.

2
Michael Todd

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

SELECT *
INTO Foo
FROM Bar
WHERE x=y

Die INTO-Klausel ist in SQL Server 2000-2005 vorhanden, erfordert jedoch weiterhin die Angabe von Spaltennamen. 2008 scheint die Möglichkeit zu bieten, SELECT * zu verwenden.

Weitere Informationen finden Sie in den MSDN-Artikeln zu INTO ( SQL2005 ), ( SQL2008 ).

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

1
Skeolan

Alle obigen Antworten funktionierten aus irgendeinem Grund nicht für mich in SQL Server 2012. In meiner Situation habe ich versehentlich alle Zeilen anstatt nur einer Zeile gelöscht. Nachdem unser Datenbankadministrator die Tabelle auf dbo.foo_bak Wiederhergestellt hat, habe ich die folgende Anweisung zum Wiederherstellen verwendet. HINWEIS: Dies funktioniert nur, wenn die Sicherungstabelle (dargestellt durch dbo.foo_bak) Und die Tabelle, in die Sie schreiben (dbo.foo), Exakt dieselben Spaltennamen haben.

Das hat bei mir mit einer Mischung aus verschiedenen Antworten funktioniert:

USE [database_name];
GO
SET IDENTITY_INSERT dbo.foo ON;
GO
INSERT INTO [dbo].[foo]
           ([rown0]
           ,[row1]
           ,[row2]
           ,[row3]
           ,...
           ,[rown])
     SELECT * FROM [dbo].[foo_bak];
GO
SET IDENTITY_INSERT dbo.foo OFF;
GO

Diese Version meiner Antwort ist hilfreich, wenn Sie Primär- und Fremdschlüssel haben.

1
iamdoubz

Wie Sie wahrscheinlich aus früheren Antworten verstanden haben, können Sie nicht wirklich das tun, wonach Sie suchen. Ich denke, Sie können das Problem verstehen, das bei SQL Server auftritt, wenn Sie nicht wissen, wie die zusätzlichen/fehlenden Spalten zugeordnet werden sollen.

Das heißt, da Sie erwähnen, dass der Zweck, den Sie hier versuchen, die Sicherung ist, können wir möglicherweise mit SQL Server arbeiten und das Problem umgehen. Wenn Sie Ihr genaues Szenario nicht kennen, ist es unmöglich, hier eine richtige Antwort zu finden, aber ich gehe davon aus, dass Folgendes zutrifft:

  • 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 enthält möglicherweise zusätzliche Spalten für Überwachungszwecke.

Ich möchte Ihnen zwei Möglichkeiten vorschlagen:

Das effizientes Üben (IMO) kann dazu dienen, Schemaänderungen mithilfe von DDL-Triggern zu erkennen und die Sicherungstabelle entsprechend zu ändern. Auf diese Weise können Sie den Ansatz '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 Überwachungstabellen automatisch verwalten. In meinem Fall habe ich eine Benennungskonvention für eine Tabelle verwendet, die Audits erfordert, und der DDL-Trigger hat sie gerade im laufenden Betrieb verwaltet.

Andere Option Für Ihr spezifisches Szenario kann es hilfreich sein, eine unterstützende Ansicht für die Tabellen zu erstellen, in der die Spaltenliste ausgerichtet ist. 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 :)

0
itayw