插入多行,不要重复“Insert INTO…”;声明的一部分?

我知道我几年前就这样做过,但我不记得语法了,而且由于调出大量关于“批量导入”的帮助文档和文章,我在任何地方都找不到它。

这是我想做的,但语法不完全正确…拜托,以前做过这件事的人帮帮我吧:)

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

我知道这是正确语法的关闭。我可能需要"散装"这个词,我不记得了。任何想法?

我需要这个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'.

853104 次浏览

你的语法几乎适用于SQL Server 2008(但不适用于SQL Server 20051):

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

当回答这个问题时,并没有明确表示这个问题指的是SQL Server 2005。我把这个答案留在这里,因为我相信它仍然是相关的。

你可以这样做(很难看,但很有效):

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

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

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

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 ID, Name FROM (
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'
) AS X (ID, Name)

这对于SQL Server 2008来说是OK的。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')

对应于插入(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)
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)

这是工作非常快,高效的SQL。 假设你有表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
)

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

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

我一直在使用以下方法:

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

它将为ID和Name添加10行具有唯一guid的行。

注意:不要以';'结束最后一行(GO 10),因为它将抛出错误:发生了致命的脚本错误。解析GO时遇到不正确的语法。

使用INSERT INTO ... VALUES语法,如在但以理他的回答 这里有一个恼人的限制:

从# EYZ0

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

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

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

LiveDemo

人力资源> < p > < 这将从SQL Server 2008+开始工作

这将达到你想要的效果:

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

对于未来的开发人员,您还可以从另一个表插入:

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

甚至从多个表中:

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

Oracle SQL Server插入多行 . SQL Server插入多行

在多表插入中,将从子查询求值返回的行中导出的计算行插入到一个或多个表中。

无条件插入全部:-要一次向表中添加多行,您可以使用以下形式的INSERT语句:

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

.

指定ALL后跟多个insert_into_clause子句来执行无条件的多表插入。Oracle数据库对子查询返回的每一行执行一次insert_into_clause子句。

MySQL Server Insert Multiple Rows .

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

单行插入查询

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

这里的其他人建议使用一些多记录语法。为此,我建议您先插入一个临时表,然后从那里插入您的主表。

这样做的原因是,从查询中加载数据可能会花费更长的时间,最终锁定表或页面的时间可能会超过所需的时间,这会降低对该表运行的其他查询的速度。

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

此外,您的id可能应该是identity(1,1),在绝大多数情况下,您可能不应该插入它们。让SQL决定这些东西你。

PostgreSQL中,你可以这样做;

2列表的通用示例;

INSERT INTO <table_name_here>
(<column_1>, <column_2>)
VALUES
(<column_1_value>, <column_2_value>),
(<column_1_value>, <column_2_value>),
(<column_1_value>, <column_2_value>),
...
(<column_1_value>, <column_2_value>);

在这里查看真实世界的例子;

A -创建表

CREATE TABLE Worker
(
id serial primary key,
code varchar(256) null,
message text null
);

插入批量值

INSERT INTO Worker
(code, message)
VALUES
('a1', 'this is the first message'),
('a2', 'this is the second message'),
('a3', 'this is the third message'),
('a4', 'this is the fourth message'),
('a5', 'this is the fifth message'),
('a6', 'this is the sixth message');