如何插入多行而不重复声明的“INSERT INTO dbo.Blah”部分?

我知道我在几年前就已经这样做了,但是我不记得语法,因为大量的关于“批量import”的帮助文档和文章,我找不到任何地方。

这是我想要做的,但语法不完全正确…请,谁做了这个之前,帮助我:)

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

我知道这是接近正确的语法。 我可能在那里需要“BULK”这个词,或者什么,我不记得了。 任何想法?

我需要这个SQL Server 2005数据库。 我试过这个代码,无济于事:

 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'.收到Incorrect syntax near the keyword 'VALUES'.

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

对于SQL Server 2008,可以在一个VALUES子句中完全按照您的问题中的语句(您只需要添加一个逗号来分隔每个值语句)…

您的语法几乎在SQL Server 2008中工作(但不在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 

1当问题得到解答时,并没有certificate这个问题是指SQL Server 2005.我在这里留下了这个答案,因为我相信它仍然是相关的。

如果你的数据已经在你的数据库中,你可以这样做:

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

如果您需要对数据进行硬编码,那么SQL 2008及更高版本可以执行以下操作…

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

你可以做到这一点(丑陋的,但它的工作原理):

 INSERT INTO dbo.MyTable (ID, Name) select * from ( select 123, 'Timmy' union all select 124, 'Jonny' union all select 125, 'Sally' ... ) x 
 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 

或者你可以使用另一种方式

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

你可以使用联合:

 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) 

对于SQL Server 2008,这看起来不错。对于SS2005及更早版本,您需要重复VALUES语句。

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

编辑::我的坏。 你必须在SS2005中的每一行重复“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') 

对应于INSERT(Transact-SQL) (SQL Server 2005),您不能省略INSERT INTO dbo.Blah并且必须每次指定它或使用其他语法/方法,

在SQL Server中使用XML插入多行会更容易,否则会变得非常繁琐。

在这里查看代码解释的完整文章http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

将以下代码复制到SQL Server中以查看示例。

 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) 

我一直在使用以下内容:

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

它将添加10个具有唯一GUID的ID和名称的行。

注意:不要用';'结束最后一行(GO 10) 因为它会抛出错误:发生致命的脚本错误。 parsingGO时遇到错误的语法。

使用INSERT INTO ... VALUES语法就像在Daniel Vassallo的答案中有一个恼人的限制:

来自MSDN

通过直接在VALUES列表中插入行可以构build的最大行数是1000

省略这个限制的最简单方法是使用派生表,如:

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

LiveDemo


这将从SQL Server 2008+工作

这工作非常快,在SQL中效率很高。 假设你有Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50) Table 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 ) 

所以你不能插入多个logging在这个表中使用下面的查询,而不重复插入语句,

 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) 

还用C#使用SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

您一次可以插入10行

  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(); }