Kaip įterpti kelias eilutes, pakartojant dalį instrukcijų INSERT INTO dbo.Blah?

Žinau, kad tai padariau anksčiau prieš metus, bet negaliu prisiminti sintaksės, ir aš negaliu jos rasti niekur, nes ištraukėme tonų referencinių dokumentų ir straipsnių apie „didmeninį importą“.

Štai ką aš noriu daryti, bet sintaksė nėra visiškai teisinga ... prašau, kas tai padarė anksčiau, padėk man :)

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

Žinau, kad tai yra arti teisingos sintaksės. Man gali prireikti žodžio "BULK", arba kažką, aš negaliu prisiminti. Bet kokia idėja?

Tam reikia SQL Server 2005 duomenų bazės.

 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 

Incorrect syntax near the keyword 'VALUES'.

423
12 апр. Timothy Khouri nustatytas balandžio 12 d 2010-04-12 22:18 '10 10:18 PM 2010-04-12 22:18
@ 12 atsakymų
 INSERT INTO dbo.MyTable (ID, Name) SELECT 123, 'Timmy' UNION ALL SELECT 124, 'Jonny' UNION ALL SELECT 125, 'Sally' 

„SQL Server 2008“ galite tai padaryti ta pačia nuostata, kaip ir jūsų klausimo išraiška (tiesiog reikia pridėti kablelį atskirti kiekvieną vertę) ...

281
12 апр. atsakymą pateikė gbn balandžio 12 d 2010-04-12 22:23 '10, 10:23 PM 2010-04-12 22:23

Sintaksė beveik veikia „SQL Server 2008“ (bet ne „SQL Server 2005 1“ ):

 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 
border=0

1 Atsakant į klausimą, nebuvo akivaizdu, kad tai buvo SQL Server 2005. Aš palieku šį atsakymą čia, nes manau, kad tai vis dar svarbu.

409
12 апр. Daniel Vassallo atsakymas, pateiktas balandžio 12 d 2010-04-12 22:23 '10, 10:23 PM 2010-04-12 22:23

Jei jūsų duomenys jau yra jūsų duomenų bazėje, galite:

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

Jei reikia koduoti duomenis, tada SQL 2008 ir vėlesnės versijos leidžia jums atlikti šiuos veiksmus:

 INSERT INTO MyTable (Name, ID) VALUES ('First',1), ('Second',2), ('Third',3), ('Fourth',4), ('Fifth',5) 
199
12 апр. atsakymas, kurį pateikė George , balandžio 12 d 2010-04-12 22:23 '10, 10:23 PM 2010-04-12 22:23

Jūs galite tai padaryti (negraži, bet tai veikia):

 INSERT INTO dbo.MyTable (ID, Name) select * from ( select 123, 'Timmy' union all select 124, 'Jonny' union all select 125, 'Sally' ... ) x 
12
12 апр. Atsakyti davek 12 balandžio. 2010-04-12 22:23 '10, 10:23 PM 2010-04-12 22:23

Jūs galite naudoti sąjungą:

 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) 
8
12 апр. Cade Roux atsakymas, pateiktas balandžio 12 d 2010-04-12 22:24 '10 10:24 val. 2010-04-12 22:24

Pavyzdžiui, naudojant „ INSERT INTO ... VALUES sintaksę Daniel Vassallo atsakymuose yra vienas erzinantis apribojimas:

MSDN

Maksimalus eilių, kurias galima sukurti įterpiant eilutes tiesiai į VALUES sąrašą, skaičius yra 1000

Lengviausias būdas praleisti šį apribojimą yra naudoti tokį vaizdą kaip:

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

LiveDemo


Tai veiks su „SQL Server 2008 +“
7
09 марта '17 в 22:11 2017-03-09 22:11 atsakymas suteiktas lad2025 kovo 09 '17, 22:11 2017-03-09 22:11

Tai atrodo normalus „SQL Server 2008“. SS2005 ir anksčiau reikia pakartoti vertę VALUES.

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

EDIT :: Mano bloga. Kiekvienai SS2005 eilutei turite pakartoti „INSERT INTO“.

 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
12 апр. Atsakymas, kurį pateikė DaveE Bal 12 2010-04-12 22:25 '10 10:25 val. 2010-04-12 22:25

Būtų lengviau naudoti XML SQL serveryje, jei norite įterpti kelias eilutes, kitaip jis taps labai varginantis.

Peržiūrėkite visą straipsnį su paaiškinimais čia http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Nukopijuokite šį kodą į SQL serverį, kad pamatytumėte mėginį.

 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
02 дек. atsakymas duotas Joe 02 Dec 2011-12-02 00:55 '11 prie 0:55 2011-12-02 00:55
 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 

ARBA GALIMA NAUDOTI KITĄ kelią

 INSERT INTO MyTable (FirstCol, SecondCol) VALUES ('First',1), ('Second',2), ('Third',3), ('Fourth',4), ('Fifth',5) 
6
02 дек. Atsakymas duotas gngolakia 02 Dec. 2011-12-02 10:36 '11 prie 10:36 2011-12-02 10:36

Naudoju:

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

Ji pridės dešimt eilučių su unikaliais GUID ID ir vardams.

Pastaba: nesibaigkite paskutine eilute (GO 10) su „;“ nes jis sukels klaidą: įvyko mirtina scenarijų klaida. Netinkama sintaksė įvykdyta analizuojant GO.

5
28 марта '16 в 16:04 2016-03-28 16:04 atsakymas pateikiamas valentinvs kovo 28 d. 16:04 2016-03-28 16:04

Pagal „ INSERT“ („Transact-SQL“) („SQL Server 2005“), negalite praleisti „ INSERT INTO dbo.Blah ir kiekvieną kartą nurodyti ją arba naudoti kitą sintaksę / metodą,

5
13 апр. atsakymas duotas abatishchev balandžio 13 d 2010-04-13 20:33 '10, 20:33, 2010-04-13 20:33

Jis veikia labai greitai ir efektyviai SQL. Tarkime, kad turite lentelę, 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 ) 

Taigi į šią lentelę negalite įterpti kelių įrašų, naudodami toliau pateiktą užklausą, pakartodami įterpimo pareiškimą,

 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) 

Taip pat naudojant C # naudodami SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

Vienu metu galite įterpti 10 eilučių.

  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(); } 
2
24 дек. Atsakymas duotas Charan Ghate 24 d. 2014-12-24 14:12 '14, 14:12, 2014-12-24 14:12