SQL 快速向表中插入100万条数据

SET NOCOUNT ON;
02 USE master;
03 GO 
04 ----判断数据库TestDB是否存在,即创建数据库
05 IF db_id('TestDB') IS NULL
06 CREATE DATABASE TestDB
07 GO
08 USE TestDB
09 GO
10 ---判断Nums 表是否存在,存在即将其删除
11 IF OBJECT_ID('dbo.Nums') IS NOT NULL
12      DROP TABLE dbo.Nums;
13 GO
14 ---重新创建表
15 CREATE TABLE dbo.Nums(n int NOT NULL PRIMARY KEY);
16 DECLARE @max AS int,@rc AS int;
17 SET @max=1000000;
18 SET @rc=1;
19    
20 INSERT INTO dbo.Nums VALUES(1);
21 WHILE @rc*2<=@max
22 BEGIN
23 INSERT INTO dbo.Nums   SELECT n+@rc FROM dbo.Nums;
24     SET @rc=@rc*2;
25     END   
26 INSERT INTO dbo.Nums
27             SELECT n+@rc FROM dbo.Nums WHERE n+@rc<=@max;
28             GO

代码分析:

SET NOCOUNT ON:这是一个存储过程,当 SET NOCOUNT 为ON 时不返回计数(表示受Transact-SQL 语句影响的行数,即消息返回:命令已完成)。当SET NOCOUNT 为OFF 时返回计数((1 行受影响)(2 行受影响)(4 行受影响)(8 行受影响)(16 行受影响)....等等返回信息).如果存储过中包含的一些语句并不返回许多实际的数据,则该设置由于大量减小了网络流量,因些可以显著提高性能。

SET @max=1000000:为定义插入的最大值。这里我设其为100W。

view source
print ?
1 INSERT INTO dbo.Nums VALUES(1);
2 WHILE @rc*2<=@max
3 BEGIN
4 INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums;
5     SET @rc=@rc*2;
6     END 
7 INSERT INTO dbo.Nums
8             SELECT n+@rc FROM dbo.Nums WHERE n+@rc<=@max;
9             GO

以上这段代码为核心代码:

INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums:的意思是:在一个While循环中的,每执行一次都会向表dbo.nums 中插入一批数据,这批数据是表dbo.nums 中原有的数据,只是字段 n 的值是在原基础上增加了2 * @rc(@rc=1,2,3,执行次数) 图解:

上图的算法就是描述这句SQL:INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums;?而 n+@rc 的值变化为 2的N次方(包括0次方)

当执行完:INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums; 时发现并没有100万条数据,然后 我们补充一句SQL语句:

INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums WHERE n+@rc<=@max; GO 这句的意思为:补全小于或等于 @max(100W);的所有数据。 执行以整个SQL语句时间可能需要几分钟,但总比一路for 的速度快吧?源码下载

你可能感兴趣的:(sql,server)