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

批量插入数据并关联其他表ID,求适用于VS的简化SQL语句

优化批量插入SQL的简洁写法

针对你需要批量插入数据到tblUserFreeProperty且重复引用tblPart中特定ordernr记录id的场景,这里提供两种更简洁、高效的写法,避免重复子查询:

方法1:使用CTE(公用表表达式)一次性获取目标ID

先通过CTE查询出ordernr=N'3CFSU05'对应的id,再和要插入的静态数据集合做交叉连接,这样只需要查询一次tblPart表:

WITH TargetPart AS (
    SELECT id FROM tblPart WHERE ordernr = N'3CFSU05'
)
INSERT INTO tblUserFreeProperty (id, identname, val, pos)
SELECT tp.id, data.identname, data.val, data.pos
FROM TargetPart tp
CROSS JOIN (
    VALUES
        (N'DSR_Mag.G', N'??_??@False', 1),
        (N'DSR_Mag.Qta_C', N'??_??@0', 2),
        (N'DSR_Mag.Qta_M', N'??_??@0', 3),
        (N'DSR_Mag.UbicM', N'??_??@No', 4),
        (N'DSR_Mag.UbicS', N'??_??@', 5),
        (N'DSR_Mag.UbicP', N'??_??@', 6),
        (N'DSR_Mag.UbicC', N'??_??@', 7)
) AS data(identname, val, pos);

方法2:使用局部变量存储目标ID(适用于SQL Server等支持变量的方言)

如果你的数据库支持局部变量,可以先把目标id存入变量,插入时直接引用变量,代码更直观:

DECLARE @TargetId INT; -- 注意:变量类型需与tblPart.id的类型一致
SELECT @TargetId = id FROM tblPart WHERE ordernr = N'3CFSU05';

INSERT INTO tblUserFreeProperty (id, identname, val, pos)
VALUES
    (@TargetId, N'DSR_Mag.G', N'??_??@False', 1),
    (@TargetId, N'DSR_Mag.Qta_C', N'??_??@0', 2),
    (@TargetId, N'DSR_Mag.Qta_M', N'??_??@0', 3),
    (@TargetId, N'DSR_Mag.UbicM', N'??_??@No', 4),
    (@TargetId, N'DSR_Mag.UbicS', N'??_??@', 5),
    (@TargetId, N'DSR_Mag.UbicP', N'??_??@', 6),
    (@TargetId, N'DSR_Mag.UbicC', N'??_??@', 7);

两种写法的优势

  • 避免重复执行相同的子查询,提升执行效率
  • 代码更简洁易维护,修改目标ordernr或插入数据时只需改动一处
  • 降低因重复子查询可能带来的不一致风险(比如tblPart中该ordernr的记录在多次查询间发生变化)

内容的提问来源于stack exchange,提问作者Gianfranco Vrech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:40:22