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

如何用T-SQL从零插入深度为X的递归表负载测试数据?

纯T-SQL生成指定深度的递归表测试数据

1. 创建匹配的表结构

先把你提供的C#类转换成对应的T-SQL表(如果还未创建):

CREATE TABLE dbo.RecursiveTable (
    Id UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
    Name NVARCHAR(100) NOT NULL,
    ParentId UNIQUEIDENTIFIER NOT NULL
);

2. 从零生成指定深度的递归数据

通过递归CTE直接生成并插入数据,无需初始数据支撑。只需调整@MaxDepth的值即可控制递归深度X,同时可自定义每个父节点的子节点数量:

DECLARE @MaxDepth INT = 5; -- 设置目标递归深度X
DECLARE @ChildNodesPerParent INT = 3; -- 每个父节点生成的子节点数量,按需调整

WITH NumberSeed AS (
    -- 生成指定数量的种子值,用来控制每个父节点的子节点数
    SELECT TOP (@ChildNodesPerParent) Num = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    FROM sys.all_columns
),
RecursiveCTE AS (
    -- 锚点:生成根节点(深度1)
    SELECT 
        Id = NEWID(),
        Name = 'Level 1 - Node 1',
        ParentId = '00000000-0000-0000-0000-000000000000', -- 根节点无父节点,用空Guid标识,可按业务规则调整
        CurrentDepth = 1
    UNION ALL
    -- 递归:生成各级子节点,直到达到最大深度
    SELECT 
        Id = NEWID(),
        Name = 'Level ' + CAST(rc.CurrentDepth + 1 AS NVARCHAR) + ' - Node ' + CAST(ns.Num AS NVARCHAR),
        ParentId = rc.Id,
        CurrentDepth = rc.CurrentDepth + 1
    FROM RecursiveCTE rc
    CROSS JOIN NumberSeed ns
    WHERE rc.CurrentDepth < @MaxDepth
)
INSERT INTO dbo.RecursiveTable (Id, Name, ParentId)
SELECT Id, Name, ParentId
FROM RecursiveCTE;

3. 适配反复增删的测试场景

如果需要频繁执行增删操作,可把生成逻辑封装成存储过程,方便重复调用:

CREATE PROCEDURE GenerateRecursiveTestData
    @MaxDepth INT,
    @ChildNodesPerParent INT
AS
BEGIN
    SET NOCOUNT ON;
    -- 快速清空表,用于每次生成全新数据
    TRUNCATE TABLE dbo.RecursiveTable;

    WITH NumberSeed AS (
        SELECT TOP (@ChildNodesPerParent) Num = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
        FROM sys.all_columns
    ),
    RecursiveCTE AS (
        SELECT 
            Id = NEWID(),
            Name = 'Level 1 - Node 1',
            ParentId = '00000000-0000-0000-0000-000000000000',
            CurrentDepth = 1
        UNION ALL
        SELECT 
            Id = NEWID(),
            Name = 'Level ' + CAST(rc.CurrentDepth + 1 AS NVARCHAR) + ' - Node ' + CAST(ns.Num AS NVARCHAR),
            ParentId = rc.Id,
            CurrentDepth = rc.CurrentDepth + 1
        FROM RecursiveCTE rc
        CROSS JOIN NumberSeed ns
        WHERE rc.CurrentDepth < @MaxDepth
    )
    INSERT INTO dbo.RecursiveTable (Id, Name, ParentId)
    SELECT Id, Name, ParentId
    FROM RecursiveCTE;
END;

调用示例

-- 生成深度为6、每个父节点带4个子节点的测试数据
EXEC GenerateRecursiveTestData @MaxDepth = 6, @ChildNodesPerParent = 4;

-- 快速清空数据
TRUNCATE TABLE dbo.RecursiveTable;

内容的提问来源于stack exchange,提问作者Julian Wen Hsi Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:33:32