Mevcut tabloya SQL Server SELECT


384

Bir tablodan bazı alanları seçmek ve saklı yordamdan varolan bir tabloya eklemek çalışıyorum. İşte ne çalışıyorum:

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

SELECT ... INTO ...Geçici tablolar için olduğunu düşünüyorum bu yüzden bir hata alıyorumdbo.TableTwo zaten var .

Nasıl birden fazla satır ekleyebilir dbo.TableOneiçine dbo.TableTwo?


29
Bir cevabı zaten kabul ettiğiniz için, sadece bir not sunmak istedim: Into'yu seçin "geçici tablolar için" değil, sorgunun seçme kısmının yapısına (ve verilerine) dayalı yeni bir tablo oluşturmak içindir . Bir tablo X için, herhangi bir veri eklemek için içine en fazla 1 kez * seçebilirsiniz. * Tablo zaten varsa, o zaman sıfır kez. Tabii ki önce masa DAMLA sürece.
pinkfloydx33

8
ancak Select Into dizin / birincil anahtar / yabancı anahtar kısıtlamalarını kopyalamaz, bu nedenle sizi dizine eklenmemiş bir yığın veri ile bırakır. Hızlı geliştirme çalışmaları için yararlıdır, ancak gerçek bir üretim tablosu eklemenin / taşımanın yolu yoktur.
Graham Griffiths

sadece bu tabloyu çalıştırın 'drop table tabletwo;' ve yukarıdaki sorguyu çalıştırın. Geçici tablolar için değil ... seçeneğini belirleyin.
Shiwangini

Yanıtlar:


637

SELECT ... INTO ... yalnızca INTO yan tümcesinde belirtilen tablo yoksa çalışır - aksi takdirde şunu kullanmanız gerekir:

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

Bu, dbo'da yalnızca iki sütun olduğunu varsayar.TABLETWO - aksi takdirde sütunları belirtmeniz gerekir:

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

52
Hepsi orada olsun veya olmasın, sütunları her zaman belirtmek en iyi uygulamadır. Birisi sütun eklediğinde işlerin kırılmasını önlemeye yardımcı olur.
HLGEM

1
Hmm, SELECT... INTO...deyimde belirtilen tablo INTOzaten yoksa deyim çalışmıyor gibi görünüyor . Bir "bildirilmemiş değişken" hatası alıyorum. Yine de bu sorun sadece MySQL içindir. CREATE TABLE ... LIKE .. worked;
LazerSharks

1
@Gnuey SELECT ... INTO ... sadece mevcut bir tablo varsa çalışır. Varolan tablo yoksa, orijinal Yazarın biçimini kullanan (yani, yeni bir tablo oluşturmak gerekir)
Will

6
@Will Söylediklerinin tersini mi kast ettin? ´SELECT ... INTO ... ´, varolmayan bir tablonun belirtilmesini gerektirirken, ´INSERT INTO ... ´ mevcut bir tablonun belirtilmesini gerektirir.
André C. Andersen

5
Keşke tekrar kontrol ve bu cevabı kullanmak için bir sayaç olsaydı!
MTAdmin

13

Bir tablodan başka bir tabloya veri eklemenin iki farklı yolu vardır.

Mevcut Tablo için - SEÇİME SEÇ

Bu yöntem, tablo daha önce veritabanında oluşturulmuşsa ve veriler başka bir tablodan bu tabloya eklenecekse kullanılır. Insert yan tümcesi ve select yan tümcesinde listelenen sütunlar aynıysa, bunları listelemeleri gerekmez. Bunları her zaman okunabilirlik ve ölçeklenebilirlik amacıyla listelemek iyi bir uygulamadır.

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

Mevcut Olmayan Tablo için - SELECT INTO

Bu yöntem, tablo daha önce oluşturulmadığında kullanılır ve bir tablodaki veriler başka bir tablodan yeni oluşturulan tabloya eklenecekse oluşturulmalıdır. Yeni tablo, seçilen sütunlarla aynı veri türleriyle oluşturulur.

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


3

Aşağıdaki gibi çalışır:

insert into Gengl_Del Select Tdate,DocNo,Book,GlCode,OpGlcode,Amt,Narration 
from Gengl where BOOK='" & lblBook.Caption & "' AND DocNO=" & txtVno.Text & ""

5
-1'e karşı koymak için -1 ve diğer kullanıcılar tarafından kullanılabilecek veya referans verilebilecek fikirler verme çabası için. @MarkSowul SQL enjeksiyonu hakkına sahiptir, ancak akademik amaçlarla diğer insanlar bu tür bir yöntemi deneyebilirler.
Albert Laure

1
Çoğu tablonun eklenemeyen bir otomatik artış alanı vardır. Yani SELECT *çalışmayacak. Bu daha iyi bir yol, teşekkürler!
MJH

2
@ User6675636b20796f7521 Bahsettiğimiz SQL enjeksiyonu ise, diğer insanların bu tür bir yöntemi denemelerinin "tamam" olduğunu öne sürecek kadar ileri gitmezdim. Asla yapılmamalı ve böylece asla denenmemelidir. En başından itibaren bunu yapmanın doğru yolunu gösteren bu cevabı düzenlemek çok daha verimli olurdu ve eğer biri sorarsa, "soru işaretleri / sembollerde ne var?" "Bunlar parametrelenmiş sorgularda (kapsam dışı) kullanım için parametre işaretleyicilerdir" yanıtını verir ve oradan anlamasını sağlar.
Matt Borja

2
select *
into existing table database..existingtable
from database..othertables....

Bir select * into tablename from other tablenamesdahaki sefere eklemek için zaten kullandıysanız ,select * into existing table tablename from other tablenames


2
PS SYBASE ASE 15.5
Verena_Techie üzerinde

10
OP, MS SQL istiyor.
GrandMasterFlush

1

Hedef tablo halinde var mıdır ancak sütun adlarını belirtmek istemiyorum:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.