批量插入数据并关联其他表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
相关产品推荐
相关产品推荐

