İfadenin “INSERT INTO…” bölümünü tekrar etmeden birden çok satır mı eklemelisiniz?


536

Bunu yıllar önce yaptığımı biliyorum, ancak sözdizimini hatırlayamıyorum ve "toplu ithalat" ile ilgili tonlarca yardım belgesini ve makalesini çektiğim için hiçbir yerde bulamıyorum.

İşte yapmak istediğim şey, ancak sözdizimi tam olarak doğru değil ... lütfen, bunu daha önce yapan biri bana yardım et :)

INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
    (124, 'Jonny'),
    (125, 'Sally')

Bunun doğru sözdizimine yakın olduğunu biliyorum . Orada "BULK" kelimesine ihtiyacım olabilir, ya da hatırlayamadığım bir şey. Herhangi bir fikir?

Bir SQL Server 2005 veritabanı için buna ihtiyacım var. Bu kodu denedim, boşuna:

DECLARE @blah TABLE
(
    ID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(100) NOT NULL
)

INSERT INTO @blah (ID, Name)
    VALUES (123, 'Timmy')
    VALUES (124, 'Jonny')
    VALUES (125, 'Sally')

SELECT * FROM @blah

Ben alıyorum Incorrect syntax near the keyword 'VALUES'.


4
Yukarıdaki kodunuz iyi, sadece değer ifadesinden sonra ',' eklemeniz gerekiyor
sam

4
@Blah (ID, Name), VALUES (123, 'Timmy'), VALUES (124, 'Jonny'), VALUES (125, 'Sally')
sam

1
Dikkat: 1000'e kadar satır yalnızca bu yöntemle ekleyebilirsiniz. INSERT INTO #test (LWPurchaseOrderID) VALUES (935791), (935933)
Anoop Verma

16
2005 artık desteklenmemektedir. 2008, 2012 ve 2016 için neredeyseINSERT INTO @blah (ID, Name) VALUES (123, 'Timmy'), (124, 'Jonny'), (125, 'Sally') "DEĞERLER" i koyduğunuz şeyi kullanabilirsiniz sadece bir kez görünür ve setler arasında virgül gerekir.
J. Chris Compton

Yanıtlar:


328
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'

SQL Server 2008 için, tam olarak sorunuzdaki ifadeye göre bir VALUES deyiminde yapabilirsiniz (her bir değer ifadesini ayırmak için bir virgül eklemeniz yeterlidir) ...


10
Bu, birden fazla INSERT ifadesi kullanmaktan daha mı etkili?
Kod Komutanı

7
@Kod Komutanı: hayır, derlemesi daha uzun olduğu için. Evet, sadece bir ekiniz var. Hiçbir tekrarı: Ama soru cevaplarINSERT table (columnlist)
GBN

3
@VoidKing Bunun yarım yıl sonra geldiğini biliyorum ve bunu uzun zaman önce çözmüş olabilirsiniz, ama gerçekten oldukça basit. Kullanarak selectsütun ve satır içeren bir küme oluşturursunuz ve tasarımla bu satırlar inserteşit miktarda sütun içeren başka bir tabloya düzenlenebilir. Değişmez değerlerin ve değerlerin bir karışımını bile kullanabilirsiniz. Örneğin, kullanılarak insertolan select 'A', ID from ATableilk sütununda her zaman ve her ikinci sütunda Atable karşılık gelen satır numarası sütun değeri 'A' eklemek olacaktır.
MarioDS

1
Bu aynı zamanda modası geçmiş teknolojide sıkışmış olanlar için önemli bir sidenote olan DB2 ile de çalışır. SQL Server 2008 veya daha yeni sürümlerde çalışanlar için virgül yanıtı ile ayrılmış değerler daha iyi. OP ilk hariç tüm "değerleri" kaldırabilir ve yerine bir,
JPK

1
@PRMan SQL Server 2008 sürümünden sonra bunu yapmazsınız. Belirtildiği gibi ...
gbn

510

Sözdiziminiz neredeyse SQL Server 2008'de çalışıyor (ancak SQL Server 2005 1'de çalışmıyor ):

CREATE TABLE MyTable (id int, name char(10));

INSERT INTO MyTable (id, name) VALUES (1, 'Bob'), (2, 'Peter'), (3, 'Joe');

SELECT * FROM MyTable;

id |  name
---+---------
1  |  Bob       
2  |  Peter     
3  |  Joe       

1 Soru cevaplandığında, sorunun SQL Server 2005'e atıfta bulunduğu belli değildi. Hala ilgili olduğuna inandığım için bu cevabı burada bırakıyorum.


SQL Server 2012'de çalışıyor
user2601995

27
Server 2008, bu yolla 1000'den fazla satır eklenmesine izin vermez.
Michael - Clay Shirky

1
Bir değer kümesi hatalıysa ne olur? Tüm kesici uçlar geri mi dönecek yoksa sadece hatalı satır mı?
netblognet

2
@netblognet Sadece hatalı satırların eklenmediğini test ettim (diğerlerinin tümü doğru bir şekilde yerleştirildi)
Mauricio Gracia Gutierrez


243

Verileriniz zaten veritabanınızda bulunuyorsa şunları yapabilirsiniz:

INSERT INTO MyTable(ID, Name)
SELECT ID, NAME FROM OtherTable

Verileri sabit olarak kodlamanız gerekiyorsa, SQL 2008 ve sonraki sürümleri aşağıdakileri yapmanıza izin verir ...

INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)

28

Daniel Vassallo'nun cevabındaki INSERT INTO ... VALUESgibi sözdizimini kullanmak , can sıkıcı bir sınırlama var:

itibaren MSDN

Doğrudan DEĞERLER listesine satır eklenerek oluşturulabilecek maksimum satır sayısı 1000'dir

Bu sınırlamayı atlamanın en kolay yolu, türetilmiş tabloyu şu şekilde kullanmaktır:

INSERT INTO dbo.Mytable(ID, Name)
SELECT ID, Name 
FROM (
   VALUES (1, 'a'),
          (2, 'b'),
          --...
          -- more than 1000 rows
)sub (ID, Name);

LiveDemo


Bu, SQL Server 2008 ve sonrasında çalışır


Bu 'alt' sözdizimi hakkında bir makaleye bağlantı alabilir miyim.
CodeCamper

2
@CodeCamper docs.microsoft.com/tr-tr/sql/t-sql/queries/… bölüm:C. Specifying multiple values as a derived table in a FROM clause
Lukasz Szozda

3
Bu cevabın avantajı, aynı değerleri tekrar etmeden belirtmenin bir yolunu sağlamasıdır (aradığım şey budur). Örneğin, aynı olan üçüncü bir sütunla, bunu bin kez tekrarlamanız gerekmez.
Vadim Berman

1
@VadimBerman Evet, bu tabloda tanımlanmış bir varsayılan yoksa iyi bir senaryodur.
Lukasz Szozda

14

Bunu yapabilirsin (çirkin ama işe yarıyor):

INSERT INTO dbo.MyTable (ID, Name) 
select * from
(
 select 123, 'Timmy'
  union all
 select 124, 'Jonny' 
  union all
 select 125, 'Sally'
 ...
) x

10

Bu, sorduğunuz şeyi başaracaktır:

INSERT INTO table1 (ID, Name)
    VALUES (123, 'Timmy'), 
           (124, 'Jonny'), 
           (125, 'Sally');

Gelecekteki geliştiriciler için başka bir tablodan da ekleyebilirsiniz :

INSERT INTO table1 (ID, Name)
    SELECT 
         ID, 
         Name 
    FROM table2

Veya birden fazla tablodan :

INSERT INTO table1 (column2, column3)
    SELECT 
         t2.column, 
         t3.column
    FROM table2 t2
         INNER JOIN table3 t3
         ON t2.ID = t3.ID

8

Birlik kullanabilirsiniz:

INSERT INTO dbo.MyTable (ID, Name) 
SELECT ID, Name FROM (
    SELECT 123, 'Timmy'
    UNION ALL
    SELECT 124, 'Jonny'
    UNION ALL
    SELECT 125, 'Sally'
) AS X (ID, Name)

6

Bu, SQL Server 2008 için uygun görünüyor. SS2005 ve öncesi için VALUES deyimini tekrarlamanız gerekir.

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
VALUES (124, 'Jonny')   
VALUES (125, 'Sally')  

EDIT :: Benim hatam. SS2005'teki her satır için 'INT INTO' işlemini tekrarlamanız gerekir.

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (124, 'Jonny')   
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (125, 'Sally')  

6

Birden çok satır eklemek için SQL Server'da XML kullanmak daha kolay olurdu, aksi takdirde çok sıkıcı olur.

Kod açıklamalarıyla birlikte makalenin tamamını http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Bir örneği görüntülemek için aşağıdaki kodu sql sunucusuna kopyalayın.

declare @test nvarchar(max)

set @test = '<topic><dialog id="1" answerId="41">
        <comment>comment 1</comment>
        </dialog>
    <dialog id="2" answerId="42" >
    <comment>comment 2</comment>
        </dialog>
    <dialog id="3" answerId="43" >
    <comment>comment 3</comment>
        </dialog>
    </topic>'

declare @testxml xml
set @testxml = cast(@test as xml)
declare @answerTemp Table(dialogid int, answerid int, comment varchar(1000))

insert @answerTemp
SELECT  ParamValues.ID.value('@id','int') ,
ParamValues.ID.value('@answerId','int') ,
ParamValues.ID.value('(comment)[1]','VARCHAR(1000)')
FROM @testxml.nodes('topic/dialog') as ParamValues(ID)

6
USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
UNION ALL
SELECT 'Fourth' ,4
UNION ALL
SELECT 'Fifth' ,5
GO

VEYA BAŞKA BİR ŞEKİLDE KULLANABİLİRSİNİZ

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES 
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)

6

Aşağıdakileri kullanıyorum:

INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10

Kimlik ve Ad için benzersiz GUID'lere sahip on satır ekleyecektir.

Not: Son satırı (GO 10) ';' ile bitirmeyin çünkü hata verecektir: Önemli bir komut dosyası hatası oluştu. GO ayrıştırılırken yanlış sözdizimi ile karşılaşıldı.


5

Karşılıkları INSERT (Transact-SQL) değil omit (2005 SQL Server) olabilir INSERT INTO dbo.Blahve bunu her zaman belirtebilir veya başka bir sözdizimi / yaklaşım kullanmak zorunda


2

Bu SQL'de çok hızlı ve verimli çalışıyor. Diyelim ki tablonuz var Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50).

CREATE TABLE [dbo].[Sample](
[a] [int] NULL,
[b] [int] NULL,
[c] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[D] [int] NULL
)

Bu nedenle, insert deyimini tekrar etmeden aşağıdaki sorguyu kullanarak bu tabloya birden fazla kayıt ekleyemezsiniz,

DECLARE @LIST VARCHAR(MAX)
SET @LIST='SELECT 1, 1, ''Charan Ghate'',11
     SELECT 2,2, ''Mahesh More'',12
     SELECT 3,3,''Mahesh Nikam'',13
     SELECT 4,4, ''Jay Kadam'',14'
INSERT SAMPLE (a, b, c,d) EXEC(@LIST)

Ayrıca C # kullanarak SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

Bir seferde 10 satır ekleyebilirsiniz

   DataTable dt = new DataTable();
        dt.Columns.Add("a");
        dt.Columns.Add("b");
        dt.Columns.Add("c");
        dt.Columns.Add("d");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dt.NewRow();
            dr["a"] = 1;
            dr["b"] = 2;
            dr["c"] = "Charan";
            dr["d"] = 4;
            dt.Rows.Add(dr);
        }
        SqlConnection con = new SqlConnection("Connection String");
        using (SqlBulkCopy bulkcopy = new SqlBulkCopy(con))
        {
            con.Open();
            bulkcopy.DestinationTableName = "Sample";
            bulkcopy.WriteToServer(dt);
            con.Close();
        }

0

Oracle SQL Server Birden Çok Satır Ekle

Çok değişkenli bir ekte, bir alt sorgunun değerlendirilmesinden döndürülen satırlardan türetilen hesaplanmış satırları bir veya daha fazla tabloya eklersiniz.

Koşulsuz INSERT ALL : - Bir kerede bir tabloya birden çok satır eklemek için INSERT ifadesinin aşağıdaki formunu kullanırsınız:

INSERT ALL
   INTO table_name (column_list) VALUES (value_list_1)
   INTO table_name (column_list) VALUES (value_list_2)
   INTO table_name (column_list) VALUES (value_list_3)
   ...
   INTO table_name (column_list) VALUES (value_list_n)
SELECT 1 FROM DUAL; -- SubQuery

Koşulsuz çoklu tablo eklemek için ALL ve ardından birden fazla insert_into_clauses belirtin. Oracle Database, alt sorgu tarafından döndürülen her satır için her insert_into_clause öğesini bir kez yürütür.

MySQL Sunucusu Birden Çok Satır Ekleme

INSERT INTO table_name (column_list)
VALUES
    (value_list_1),
    (value_list_2),
    ...
    (value_list_n);

Tek Sıralı Sorgu

INSERT INTO table_name (col1,col2) VALUES(val1,val2);

0

Buradaki diğerleri birkaç çoklu kayıt sözdizimi önerdi. Bunun üzerine, önce geçici bir tabloya girmenizi ve ana masanızı oradan eklemenizi öneririm.

Bunun nedeni, bir sorgudan veri yüklemek daha uzun sürebilir ve tabloyu veya sayfaları gerekenden daha uzun süre kilitlemeniz gerekebilir, bu da bu tabloya karşı çalışan diğer sorguları yavaşlatır .

-- Make a temp table with the needed columns
select top 0 *
into #temp
from MyTable (nolock)

-- load data into it at your leisure (nobody else is waiting for this table or these pages)
insert #temp (ID, Name)
values (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally')

-- Now that all the data is in SQL, copy it over to the real table. This runs much faster in most cases.
insert MyTable (ID, Name)
select ID, Name
from #temp

-- cleanup
drop table #temp

Ayrıca, kimlikleriniz muhtemelen kimlik (1,1) olmalı ve koşulların büyük çoğunluğunda bunları eklememelisiniz. SQL sizin için bu şeylere karar versin .

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.