如何在 SQL Server 中插入 100000 行?

Posted

技术标签:

【中文标题】如何在 SQL Server 中插入 100000 行?【英文标题】:How can I insert 100000 rows in SQL Server? 【发布时间】:2011-10-12 08:52:15 【问题描述】:
INSERT INTO pantscolor_t (procode, color, pic) 
VALUES
('74251', 'Black', '511black.jpg'),
('74251', 'OD Green', '511odgreen.jpg'),
('74251', 'Black', '511black.jpg'),
('74251', 'OD Green', '511odgreen.jpg'),
('74251', 'Black', '511black.jpg'),
('74251', 'OD Green', '511odgreen.jpg'),
..........
..........
..........

INSERT INTO pantscolor_t (procode,color,pic)
VALUES
('74251', 'Charcoal', '511charcoal.jpg'),
('74251', 'Charcoal', '511charcoal.jpg'),
('74251', 'Charcoal', '511charcoal.jpg'),
('74251', 'Charcoal', '511charcoal.jpg'),
.............
.............
.............

 INSERT INTO........................
 INSERT INTO........................
 INSERT INTO........................
 INSERT INTO........................

我有 100000 行这样的行,但我的插入语句大于 1000 行。在 SSMS 中运行 SQL 语句时,出现错误:

INSERT 语句中的行值表达式的数量超过了允许的最大行值数 1000。

【问题讨论】:

【参考方案1】:

另一种解决方案是使用带有联合的选择查询。

INSERT INTO pantscolor_t (procode,color,pic)
SELECT '74251', 'Black', '511black.jpg'
UNION ALL SELECT '74251', 'OD Green', '511odgreen.jpg'
UNION ALL SELECT '74251', 'Black', '511black.jpg'
UNION ALL SELECT '74251', 'OD Green', '511odgreen.jpg'
UNION ALL SELECT '74251', 'Black', '511black.jpg'
UNION ALL SELECT '74251', 'OD Green', '511odgreen.jpg'
--etc....

UNION ALL 用于代替UNION,以便在处理数千条记录时加快查询速度。 UNION ALL 允许重复行,而UNION 将确保结果集中不存在重复行。对于这种情况,我们不想删除任何可能的重复项,因此使用UNION ALL

【讨论】:

【参考方案2】:

创建 csv 文件(或具有定义的字段分隔符和行分隔符的某些文件)并使用“BULK INSERT”选项将文件加载到数据库。文件可以有 100000 行;使用批量上传加载大文件不会有任何问题。

http://msdn.microsoft.com/en-us/library/ms188365.aspx

【讨论】:

+1 从代码中,您可以使用SqlBulkCopy 类 那我猜;转换成csv文件会很容易。 您也可以使用bcp.exe : bcp mytable in data.txt -S (local) -d mydatabase -T -c (-T 用于信任连接,-c 用于字符数据,您可以将其用于制表符分隔的文件。您可以使用bcp --help 查看其他选项例如 -t 用于字段 -r 用于行终止符,以防您的数据不是制表符分隔或制表符分隔)【参考方案3】:
INSERT mytable (col1, col2, col3, col4, col5, col6)
SELECT * FROM (VALUES
('1502577', '0', '114', 'chodba', 'Praha', 'Praha 1'),
('1503483', '0', 'TVP', 'chodba', 'Praha', 'Praha 2'),
/* ... more than 1000 rows ... */
('1608107', '0', '8', 'sklad', 'Tlumačov', 'Tlumačov'),
('1608107', '0', '9', 'sklad', 'Tlumačov', 'Tlumačov')
) AS temp (col1, col2, col3, col4, col5, col6);

【讨论】:

在循环中构建查询时很有用。工作!谢谢 救命稻草,谢谢!【参考方案4】:

通过应用以下内容,您应该不会有任何错误:

INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251','Black','511black.jpg')

INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251', 'OD Green', '511odgreen.jpg')

INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251', 'Black', '511black.jpg')

INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251', 'OD Green', '511odgreen.jpg')

INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251', 'Black', '511black.jpg')

...........

我试过了,效果很好,当然你可以使用excel轻松连接值。

【讨论】:

这个过程会很慢【参考方案5】:

创建一个 csv out.csv 等 然后使用:

批量插入 从'C:\ out.csv' 和 ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) 去

【讨论】:

以上是关于如何在 SQL Server 中插入 100000 行?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:必须声明标量变量

如何在 SQL Server 2005 中插入值数组?

如何在 SQL Server 中插入多行?

sql server 中如何插入一条时间记录

如何在 SQL Server 2005 中进行更新插入(更新或插入)

sql server如何如何从一个表中提取部分资讯插入到另一表中