SQL Server SELECT menjadi tabel yang sudah ada

384

Saya mencoba memilih beberapa bidang dari satu tabel dan menyisipkannya ke tabel yang ada dari prosedur tersimpan. Inilah yang saya coba:

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

Saya pikir SELECT ... INTO ...untuk tabel sementara itulah mengapa saya mendapatkan kesalahan yang dbo.TableTwosudah ada.

Bagaimana saya bisa memasukkan beberapa baris dari dbo.TableOnedalam dbo.TableTwo?

Daniel
sumber
29
Karena Anda sudah menerima jawaban, saya hanya ingin menawarkan catatan: Pilih Ke bukan "untuk tabel sementara", itu untuk membuat tabel baru berdasarkan struktur (dan data) dari bagian pilih dari kueri . Untuk tabel X, Anda hanya dapat memilih Ke maksimum 1 kali *, setelah itu Anda harus menggunakan Sisipkan Ke untuk menambahkan data apa pun. * Jika tabel sudah ada, maka nol kali. Ini tentu saja kecuali Anda DROP tabelnya terlebih dahulu.
pinkfloydx33
8
tetapi harap dicatat bahwa Select Into tidak menyalin batasan indeks / primary key / foreign key, sehingga membuat Anda dengan heap-o-data tidak tereksplorasi. Ini berguna untuk pekerjaan pengembang cepat, tetapi bukan cara untuk menambah / memindahkan tabel produksi nyata.
Graham Griffiths
jalankan saja pernyataan ini 'drop table tabletwo;' dan jalankan kueri di atas. Pilih ... menjadi bukan untuk tabel sementara.
Shiwangini

Jawaban:

637

SELECT ... INTO ... hanya berfungsi jika tabel yang ditentukan dalam klausa INTO tidak ada - jika tidak, Anda harus menggunakan:

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

Ini mengasumsikan hanya ada dua kolom di dbo.TABLETWO - Anda harus menentukan kolom lain:

INSERT INTO dbo.TABLETWO
  (col1, col2)
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key
OMG Ponies
sumber
52
Ini adalah praktik terbaik untuk selalu menentukan kolom tidak peduli apakah semuanya ada atau tidak. Ini akan membantu mencegah hal-hal dari kerusakan ketika seseorang menambahkan kolom.
HLGEM
1
Hmm, SELECT... INTO...pernyataan itu tampaknya tidak berfungsi jika tabel yang ditentukan dalam INTOklausa belum ada. Saya mendapatkan kesalahan "variabel tidak dideklarasikan". Padahal mungkin masalah ini hanya untuk MySQL. The CREATE TABLE ... LIKE .. worked;
LazerSharks
1
@Gnuey SELECT ... INTO ... hanya berfungsi jika ada tabel yang ada. Jika tidak ada tabel yang ada, gunakan format poster asli (yang akan membuat tabel baru)
Will
6
@ Akankah Anda berseberangan dengan apa yang Anda katakan? ´SELECT ... INTO ... ´ membutuhkan tabel yang tidak ada untuk ditentukan, sementara ´ INSERT INTO ... ´ membutuhkan tabel yang sudah ada untuk ditentukan.
André C. Andersen
5
Saya berharap ada penghitung berapa kali saya memeriksa kembali dan menggunakan jawaban ini!
MTAdmin
13

Ada dua cara berbeda untuk mengimplementasikan memasukkan data dari satu tabel ke tabel lainnya.

For Existing Table - INSERT INTO SELECT

Metode ini digunakan ketika tabel sudah dibuat dalam database sebelumnya dan data akan dimasukkan ke dalam tabel ini dari tabel lain. Jika kolom yang tercantum dalam klausa sisipan dan pilih klausa sama, mereka tidak diharuskan untuk mencantumkannya. Merupakan praktik yang baik untuk selalu membuat daftar mereka untuk tujuan keterbacaan dan skalabilitas.

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

Untuk Tabel yang Tidak Ada - PILIH KE

Metode ini digunakan ketika tabel tidak dibuat sebelumnya dan perlu dibuat ketika data dari satu tabel akan dimasukkan ke dalam tabel yang baru dibuat dari tabel lain. Tabel baru dibuat dengan tipe data yang sama dengan kolom yang dipilih.

----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
sumber
3

Ini akan bekerja seperti yang diberikan di bawah ini:

insert into Gengl_Del Select Tdate,DocNo,Book,GlCode,OpGlcode,Amt,Narration 
from Gengl where BOOK='" & lblBook.Caption & "' AND DocNO=" & txtVno.Text & ""
Vinod Pareek
sumber
5
+1 untuk menetralkan -1 dan untuk upaya memberikan ide yang dapat digunakan atau dirujuk oleh pengguna lain. @MarkSowul benar injeksi SQL tetapi demi tujuan akademis orang lain dapat mencoba metode semacam itu.
Albert Laure
1
Sebagian besar tabel memiliki bidang kenaikan otomatis, yang tidak dapat dimasukkan. Jadi SELECT *tidak akan berhasil. Ini cara yang lebih baik, terima kasih!
MJH
2
@ User6675636b20796f7521 Saya tidak akan terlalu jauh dengan menyarankan itu "oke" untuk orang lain untuk mencoba metode semacam itu, jika itu injeksi SQL yang sedang kita bicarakan. Itu tidak boleh dilakukan, dan karenanya tidak pernah dicoba. Akan jauh lebih produktif untuk mengedit jawaban ini yang menunjukkan cara yang benar untuk melakukan ini sejak awal, dan jika ada yang bertanya, "ada apa dengan tanda tanya / pada simbol?" Anda hanya menjawab, "itu adalah penanda parameter untuk digunakan dalam permintaan parameter (di luar cakupan)" dan biarkan mereka mencari tahu dari sana.
Matt Borja
2
select *
into existing table database..existingtable
from database..othertables....

Jika Anda sudah menggunakan select * into tablename from other tablenames, lain kali, untuk menambahkan, Anda katakanselect * into existing table tablename from other tablenames

Verena_Techie
sumber
2
PS Diuji pada SYBASE ASE 15.5
Verena_Techie
10
OP meminta MS SQL.
GrandMasterFlush
1

Jika tabel tujuan memang ada tetapi Anda tidak ingin menentukan nama kolom:

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
sumber