SQL如何根据WHERE子句查询结果批量重复插入固定值数据
需求场景
需要实现SQL批量插入逻辑:向ProductList表中为所有符合条件的公司插入完全相同的固定产品信息,仅CompanyID字段取查询得到的对应公司ID,ID列表通过WHERE条件筛选关联表得到。
之前的业务痛点:
- 原有查询仅能拉取安装了指定类型产品(如自定义定价类,对应ProductTypeID为71/72/73)的公司名称列表
- 前端仅支持单条公司记录操作新增产品,手动给列表内每家公司加新产品效率极低
最初用来拉取符合条件公司名的查询语句如下:
Use DBNAME SELECT DISTINCT CompanyName FROM CompanyList JOIN ProductList ON CompanyList.CompanyID = ProductList.CompanyID WHERE ProductList.ProductTypeID IN (71,72,73) ORDER BY CompanyName
最初写的单条插入模板无法实现批量动态传值,代码如下:
SET IDENTITY_INSERT [ProductList] ON INSERT [dbo].[ProductList] ([ProductID],[Name],[ProductTypeID],[Cost],[WholesaleRate],[UndeID],[Limit],[Days],[SortOrder],[Expired],[CompanyID]) VALUES (-1,'ProductF',77,3.9,5.75,7,0,0,1,'No',???) SET IDENTITY_INSERT [ProductList] OFF
注:原语句字段定义处漏写分隔逗号已补正;如果ProductID是自增主键,不需要手动开启IDENTITY_INSERT、也不需要手动指定ProductID值,避免引发主键冲突。
一开始的实现思路为:把查询返回字段从CompanyName替换为CompanyID,将查询和插入逻辑包裹在事务中,遍历WHERE子句返回的结果,通过变量传递每个CompanyID到插入语句,但不清楚具体语法实现。
可用实现代码
不需要写循环遍历逻辑,直接使用SQL Server支持的INSERT INTO ... SELECT语法,将固定产品值写在SELECT子句中,关联查询得到的CompanyID作为动态字段,即可一次性完成批量插入。调试通过的可用代码如下:
Use CVR_Sandbox begin transaction INSERT INTO [dbo].[ProductList] ([Name], [ProductTypeID], [Cost], [WholesaleRate], [UndeID], [Limit], [Days], [SortOrder], [Expired], [CompanyID]) SELECT DISTINCT 'TESTPRODUCTname', 79, 3.9, 5.75, 7, 0, 0, 1, 0, cl.CompanyID FROM CompanyList cl JOIN ProductList pl ON cl.CompanyID = pl.CompanyID WHERE pl.ProductTypeID = 71 ORDER BY cl.CompanyID rollback transaction --commit transaction
使用注意事项:
- 代码默认开启事务,首次执行时会回滚所有插入操作,可先执行验证返回的影响行数、查询验证插入数据是否符合预期
- 确认逻辑无误后,注释掉
rollback transaction行,取消commit transaction的注释,再次执行即可正式提交插入数据 - 可根据实际业务需求修改WHERE中的筛选条件、SELECT子句中的固定产品字段值
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

