如何向仅含IDENTITY列的单表插入100行?临时表单查询插入求助
嘿,我来帮你搞定这两个SQL插入的问题,都是关于仅含IDENTITY列的表插入批量数据的,我给你拆解一下:
问题1:向仅包含IDENTITY列的单个表插入100行数据?
因为表只有IDENTITY自增列,我们不需要指定任何列或提供值,数据库会自动为IDENTITY列生成递增的数值。这里有几种实用方法:
方法1:简单循环法(适合小批量场景)
逻辑直白易懂,虽然效率不算顶尖,但足够应对100行的需求:DECLARE @i INT = 1; WHILE @i <= 100 BEGIN INSERT INTO YourTableName DEFAULT VALUES; -- 直接插入默认值,IDENTITY列自动生成 SET @i = @i + 1; END方法2:批量插入法(更高效)
用递归CTE生成100行数据,一次性完成插入,比循环快不少:WITH Numbers AS ( SELECT 1 AS Num UNION ALL SELECT Num + 1 FROM Numbers WHERE Num < 100 ) INSERT INTO YourTableName DEFAULT VALUES FROM Numbers;也可以利用系统表快速生成(只要系统表行数足够):
INSERT INTO YourTableName DEFAULT VALUES FROM (SELECT TOP 100 1 FROM sys.all_columns) AS Temp;
问题2:向临时表#TEST1插入100行数据(修复你的代码+更优方案)
先说说你原来代码的两个小问题,导致它没正常运行:
- 循环条件
WHILE @i < @numRows会只插入99行——@i从1开始,到99时还满足<100,执行后@i变成100,循环就结束了,应该改成@i <= @numRows; INSERT #TEST1 SELECT TOP 1 1 FROM sysobjects a完全多余,因为表只有IDENTITY列,直接用INSERT #TEST1 DEFAULT VALUES就可以,不用额外选值。
修复后的循环代码:
DECLARE @numRows INT = 100, @i INT = 1; WHILE @i <= @numRows BEGIN INSERT #TEST1 DEFAULT VALUES; SET @i = @i + 1; END
当然,更高效的还是批量插入,比如用递归CTE:
WITH Numbers AS ( SELECT 1 AS Num UNION ALL SELECT Num + 1 FROM Numbers WHERE Num < 100 ) INSERT #TEST1 DEFAULT VALUES FROM Numbers;
或者用系统表快速生成:
INSERT #TEST1 DEFAULT VALUES FROM (SELECT TOP 100 1 FROM sys.all_columns) AS T;
内容的提问来源于stack exchange,提问作者Shaju Madheena
相关产品推荐
相关产品推荐

