You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向仅含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行数据(修复你的代码+更优方案)

先说说你原来代码的两个小问题,导致它没正常运行:

  1. 循环条件WHILE @i < @numRows会只插入99行——@i从1开始,到99时还满足<100,执行后@i变成100,循环就结束了,应该改成@i <= @numRows;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:04:19