我知道几年前我已经这样做了,但是我不记得语法了,而且由于提取了大量有关“批量导入”的帮助文档和文章,我无法在任何地方找到它。
这是我想做的,但语法不完全正确......请,以前做过这个的人,帮帮我:)
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'.
INSERT INTO @blah (ID, Name) VALUES (123, 'Timmy'), (124, 'Jonny'), (125, 'Sally')
“VALUES”只出现一次,并且您需要在集合之间使用逗号。
您的语法几乎适用于 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
1 当问题得到回答时,并没有明确表明该问题是指 SQL Server 2005。我将这个答案留在这里,因为我相信它仍然相关。
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'
对于 SQL Server 2008,可以完全按照您问题中的语句在一个 VALUES 子句中执行此操作(您只需要添加一个逗号来分隔每个值语句)...
INSERT table (columnlist)
select
,您可以创建一个包含列和行的集合,并且通过设计,这些行可以insert
编入另一个具有相同数量列的表中。您甚至可以混合使用文字和值。例如,将 insert
与 select 'A', ID from ATable
一起使用,每次都会在第一列中插入“A”,在第二列中插入 ATable 对应行的 ID 列值。
如果您的数据已经在您的数据库中,您可以执行以下操作:
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)
使用 Daniel Vassallo's 答案中的 INSERT INTO ... VALUES
语法有一个烦人的限制:
来自 MSDN 直接在 VALUES 列表中插入行可以构造的最大行数是 1000
省略此限制的最简单方法是使用派生表,例如:
INSERT INTO dbo.Mytable(ID, Name)
SELECT ID, Name
FROM (
VALUES (1, 'a'),
(2, 'b'),
--...
-- more than 1000 rows
)sub (ID, Name);
这将从 SQL Server 2008+ 开始工作
C. Specifying multiple values as a derived table in a FROM clause
你可以这样做(丑陋但有效):
INSERT INTO dbo.MyTable (ID, Name)
select * from
(
select 123, 'Timmy'
union all
select 124, 'Jonny'
union all
select 125, 'Sally'
...
) x
这将实现您的要求:
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
您可以使用联合:
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 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')
在 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)
我一直在使用以下内容:
INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10
它将添加十行具有唯一 GUID 的 ID 和名称。
注意:不要以';'结束最后一行(GO 10)因为它会抛出错误:发生了致命的脚本错误。解析 GO 时遇到不正确的语法。
这在 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();
}
在 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
);
B - 插入批量值
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');
这里的其他人建议了几个多记录语法。对此进行说明,我建议您先插入临时表,然后从那里插入主表。
这样做的原因是从查询中加载数据可能需要更长的时间,并且您最终可能会锁定表或页面的时间超过必要的时间,这会减慢针对该表运行的其他查询。
-- 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 为您决定这些东西。
Oracle SQL Server 插入多行
在多表插入中,您将从子查询评估返回的行中派生的计算行插入到一个或多个表中。
无条件 INSERT ALL:- 要一次向表中添加多行,请使用以下形式的 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
https://docs.oracle.com/cd/B19306_01/server.102/b14200/img/multi_table_insert.gif
指定 ALL 后跟多个 insert_into_clauses 以执行无条件的多表插入。 Oracle 数据库对子查询返回的每一行执行每个 insert_into_clause 一次。
MySQL 服务器插入多行
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);
不定期副业成功案例分享