SQL Server SELECT in vorhandene Tabelle

384

Ich versuche, einige Felder aus einer Tabelle auszuwählen und sie aus einer gespeicherten Prozedur in eine vorhandene Tabelle einzufügen. Folgendes versuche ich:

SELECT col1, col2
INTO dbo.TableTwo 
FROM dbo.TableOne 
WHERE col3 LIKE @search_key

Ich denke, SELECT ... INTO ...ist für temporäre Tabellen, weshalb ich einen Fehler bekomme, der dbo.TableTwobereits existiert.

Wie kann ich mehrere Zeilen von dbo.TableOnein einfügen dbo.TableTwo?

Daniel
quelle
29
Da Sie bereits eine Antwort akzeptiert haben, wollte ich nur einen Hinweis geben: Auswählen in ist nicht "für temporäre Tabellen", sondern zum Erstellen einer neuen Tabelle basierend auf der Struktur (und den Daten) des ausgewählten Teils der Abfrage . Für eine Tabelle X können Sie immer nur maximal 1 Mal * auswählen. Danach müssen Sie Insert Into verwenden, um Daten anzuhängen. * Wenn die Tabelle bereits vorhanden ist, dann nullmal. Dies ist natürlich so, es sei denn, Sie lassen die Tabelle zuerst fallen.
pinkfloydx33
8
Beachten Sie jedoch, dass Select Into keine Einschränkungen für Index / Primärschlüssel / Fremdschlüssel kopiert, sodass Sie nicht indizierte Heap-O-Daten erhalten. Es ist nützlich für schnelle Entwicklungsarbeiten, aber nicht für das Hinzufügen / Verschieben einer echten Produktionstabelle.
Graham Griffiths
Führen Sie einfach diese Anweisung 'drop table tabletwo' aus. und über Abfrage ausführen. Wählen Sie ... in ist nicht für temporäre Tabellen.
Shiwangini

Antworten:

637

SELECT ... INTO ... funktioniert nur, wenn die in der INTO-Klausel angegebene Tabelle nicht vorhanden ist - andernfalls müssen Sie Folgendes verwenden:

INSERT INTO dbo.TABLETWO
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key

Dies setzt voraus, dass dbo.TABLETWO nur zwei Spalten enthält. Andernfalls müssen Sie die Spalten angeben:

INSERT INTO dbo.TABLETWO
  (col1, col2)
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key
OMG Ponys
quelle
52
Es wird empfohlen, die Spalten immer anzugeben, unabhängig davon, ob sie alle vorhanden sind oder nicht. Es hilft zu verhindern, dass Dinge kaputt gehen, wenn jemand eine Spalte hinzufügt.
HLGEM
1
Hmm, die SELECT... INTO...Anweisung scheint nicht zu funktionieren, wenn die in der INTOKlausel angegebene Tabelle noch nicht vorhanden ist. Ich erhalte den Fehler "Nicht deklarierte Variable". Vielleicht ist dieses Problem nur für MySQL. Die CREATE TABLE ... LIKE .. worked;
LazerSharks
1
@Gnuey SELECT ... INTO ... funktioniert nur, wenn eine Tabelle vorhanden ist. Wenn keine Tabelle vorhanden ist, verwenden Sie das Format des Originalplakats (das eine neue Tabelle erstellt)
Will
6
@ Will Meinten Sie das Gegenteil von dem, was Sie gesagt haben? ´SELECT ... INTO ... ´ erfordert die Angabe einer nicht vorhandenen Tabelle, während ´INSERT INTO ... ´ die Angabe einer vorhandenen Tabelle erfordert.
André C. Andersen
5
Ich wünschte, es gäbe einen Zähler für die Häufigkeit, mit der ich zurückschaue und diese Antwort verwende!
MTAdmin
13

Es gibt zwei verschiedene Möglichkeiten, das Einfügen von Daten aus einer Tabelle in eine andere Tabelle zu implementieren.

Für vorhandene Tabelle - INSERT INTO SELECT

Diese Methode wird verwendet, wenn die Tabelle bereits früher in der Datenbank erstellt wurde und die Daten aus einer anderen Tabelle in diese Tabelle eingefügt werden sollen. Wenn die in der Einfügeklausel und der Auswahlklausel aufgeführten Spalten identisch sind, müssen sie nicht aufgelistet werden. Es wird empfohlen, sie aus Gründen der Lesbarkeit und Skalierbarkeit immer aufzulisten.

----Create testable
CREATE TABLE TestTable (FirstName VARCHAR(100), LastName VARCHAR(100))
----INSERT INTO TestTable using SELECT
INSERT INTO TestTable (FirstName, LastName)
SELECT FirstName, LastName
FROM Person.Contact
WHERE EmailPromotion = 2
----Verify that Data in TestTable
SELECT FirstName, LastName
FROM TestTable
----Clean Up Database
DROP TABLE TestTable

Für nicht vorhandene Tabelle - SELECT INTO

Diese Methode wird verwendet, wenn die Tabelle nicht früher erstellt wurde und erstellt werden muss, wenn Daten aus einer Tabelle aus einer anderen Tabelle in die neu erstellte Tabelle eingefügt werden sollen. Die neue Tabelle wird mit denselben Datentypen wie ausgewählte Spalten erstellt.

----Create a new table and insert into table using SELECT INSERT
SELECT FirstName, LastName
INTO TestTable
FROM Person.Contact
WHERE EmailPromotion = 2
----Verify that Data in TestTable
SELECT FirstName, LastName
FROM TestTable
----Clean Up Database
DROP TABLE TestTable

Ref 1 2

Somnath Muluk
quelle
3

Es würde wie folgt funktionieren:

insert into Gengl_Del Select Tdate,DocNo,Book,GlCode,OpGlcode,Amt,Narration 
from Gengl where BOOK='" & lblBook.Caption & "' AND DocNO=" & txtVno.Text & ""
Vinod Pareek
quelle
5
+1, um dem -1 entgegenzuwirken und um Ideen zu geben, die von anderen Benutzern verwendet oder referenziert werden können. @MarkSowul hat das Recht auf SQL-Injection, aber aus akademischen Gründen können andere Leute diese Art von Methode ausprobieren.
Albert Laure
1
Die meisten Tabellen haben ein Auto-Inkrement-Feld, das nicht eingefügt werden kann. So SELECT *wird nicht funktionieren. Dies ist ein besserer Weg, danke!
MJH
2
@ User6675636b20796f7521 Ich würde nicht so weit gehen zu behaupten, dass es für andere Leute "okay" ist, diese Art von Methode auszuprobieren, wenn es sich um die SQL-Injection handelt, über die wir sprechen. Es sollte niemals getan und daher niemals versucht werden. Es wäre weitaus produktiver, diese Antwort so zu bearbeiten, dass von Anfang an die richtige Vorgehensweise angezeigt wird, und wenn jemand fragt: "Was ist mit den Fragezeichen / Symbolen?" Sie antworten einfach: "Dies sind Parametermarkierungen zur Verwendung in parametrisierten Abfragen (außerhalb des Gültigkeitsbereichs)" und lassen sie von dort aus herausfinden.
Matt Borja
2
select *
into existing table database..existingtable
from database..othertables....

Wenn Sie das select * into tablename from other tablenamesnächste Mal bereits zum Anhängen verwendet haben, sagen Sieselect * into existing table tablename from other tablenames

Verena_Techie
quelle
2
PS Getestet auf SYBASE ASE 15.5
Verena_Techie
10
Das OP fragt nach MS SQL.
GrandMasterFlush
1

Wenn die Zieltabelle vorhanden ist , Sie jedoch keine Spaltennamen angeben möchten:

DECLARE @COLUMN_LIST NVARCHAR(MAX);
DECLARE @SQL_INSERT NVARCHAR(MAX);

SET @COLUMN_LIST = (SELECT DISTINCT
    SUBSTRING(
        (
            SELECT ', table1.' + SYSCOL1.name  AS [text()]
            FROM sys.columns SYSCOL1
            WHERE SYSCOL1.object_id = SYSCOL2.object_id and SYSCOL1.is_identity <> 1
            ORDER BY SYSCOL1.object_id
            FOR XML PATH ('')
        ), 2, 1000)
FROM
    sys.columns SYSCOL2
WHERE
    SYSCOL2.object_id = object_id('dbo.TableOne') )

SET @SQL_INSERT =  'INSERT INTO dbo.TableTwo SELECT ' + @COLUMN_LIST + ' FROM dbo.TableOne table1 WHERE col3 LIKE ' + @search_key
EXEC sp_executesql @SQL_INSERT
Slayernoah
quelle