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

本文介绍了一种使用SQL Server快速填充大量测试数据的方法。通过递归插入操作,仅用几分钟即可生成一百万条记录,适用于数据库性能测试场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

1INSERT INTO dbo.Nums VALUES(1);
2WHILE @rc*2<=@max
3BEGIN
4INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums;
5    SET @rc=@rc*2;
6    END 
7INSERT 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 的速度快吧?源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值