SQL Server 批量插入脚本
需求是:把70 个 menuId,不仅插入 dg_Id = 1
,而是要循环插入到指定的 20 个 dg_Id
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,21,24,25)中。
SQL Server 批量插入脚本,直接一次性生成:
INSERT INTO Tab_A_DegreeMenu (dg_Id, menuId)
SELECT dg.dg_Id, m.menuId
FROM (VALUES(100),(110),(125),(150),(160),(170),(175),(180),(185),(195),(200),(210),(225),(310),(360),(10005),(10010),(11010),(11015),(11020),(11025),(11030),(12501),(12505),(12508),(12510),(12515),(12550),(15050),(16005),(16050),(17005),(17006),(17007),(17008),(17020),(17030),(17040),(17505),(17506),(17510),(17550),(18005),(18050),(18505),(18510),(18550),(19505),(19510),(19515),(19520),(19525),(20005),(20050),(21005),(21050),(22505),(22510),(31005),(31010),(31015),(31020),(31025),(36005),(36020),(36025),(36030),(36035),(36040),(36045)
) AS m(menuId)
CROSS JOIN (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(17),(19),(21),(24),(25)
) AS dg(dg_Id);
脚本说明
VALUES (...) AS m(menuId)
→ 定义了例子中的 70 个menuId
。VALUES (...) AS dg(dg_Id)
→ 定义了 20 个dg_Id
。CROSS JOIN
→ 笛卡尔积,自动组合生成 20×70 = 1400 行数据。INSERT INTO Tab_A_DegreeMenu (dg_Id, menuId)
→ 批量插入。
这样,你就不用手工写 1400 条语句了 🚀。
带去重逻辑 的版本。我们用 NOT EXISTS
来避免重复插入相同的 (dg_Id, menuId)
组合:
INSERT INTO Tab_A_DegreeMenu (dg_Id, menuId)
SELECT dg.dg_Id, m.menuId
FROM (VALUES(100),(110),(125),(150),(160),(170),(175),(180),(185),(195),(200),(210),(225),(310),(360),(10005),(10010),(11010),(11015),(11020),(11025),(11030),(12501),(12505),(12508),(12510),(12515),(12550),(15050),(16005),(16050),(17005),(17006),(17007),(17008),(17020),(17030),(17040),(17505),(17506),(17510),(17550),(18005),(18050),(18505),(18510),(18550),(19505),(19510),(19515),(19520),(19525),(20005),(20050),(21005),(21050),(22505),(22510),(31005),(31010),(31015),(31020),(31025),(36005),(36020),(36025),(36030),(36035),(36040),(36045)
) AS m(menuId)
CROSS JOIN (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(17),(19),(21),(24),(25)
) AS dg(dg_Id)
WHERE NOT EXISTS (SELECT 1 FROM Tab_A_DegreeMenu t WHERE t.dg_Id = dg.dg_Id AND t.menuId = m.menuId
);
逻辑说明
CROSS JOIN
还是生成 20 × 70 = 1400 行候选数据。WHERE NOT EXISTS (...)
会检查表中是否已有该(dg_Id, menuId)
,有的话就跳过,避免重复插入。这样执行多次也安全,不会生成重复数据。