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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:15:39