如何在SSMS 2016中实现多行SELECT后批量INSERT到另一表/库?
批量插入多行数据到SQL Server表的解决方案
你原来的代码存在一个核心问题:当用SELECT @var = column返回多行结果时,SQL Server只会把最后一行的值赋值给变量@var,而且你的IF判断只能处理单条数据的NULL情况,完全没法覆盖100条数据的批量场景。不过别担心,SQL Server有非常高效的批量插入方案,完全能满足你的需求。
最直接的批量插入方式:INSERT...SELECT
这是SQL Server中处理批量数据插入的首选方式,不需要变量,直接将查询结果集作为插入数据源,不管返回多少行(100条甚至更多)都会一次性插入,性能远优于循环单条插入。
-- 直接将table1的指定列数据插入到table2 INSERT INTO database.dbo.table2 (column) SELECT column FROM database.dbo.table1 -- 如果只需要插入值为NULL的行,添加WHERE过滤条件 WHERE column IS NULL;
说明:
- 这个语句会自动处理
SELECT返回的所有行,不需要额外的循环或变量。 - 如果源表和目标表不在同一个数据库,只需要在表名前加上对应的数据库名和架构名(比如
AnotherDB.dbo.TargetTable)即可,支持跨数据库操作。
需中间处理数据的场景:用表变量/临时表暂存
如果需要先对查询到的100条数据做额外处理(比如修改值、筛选特定行),可以先用表变量或临时表暂存数据,再插入目标表:
-- 定义表变量暂存查询结果 DECLARE @TempData TABLE (TargetCol INT); -- 将table1的符合条件的数据存入表变量 INSERT INTO @TempData (TargetCol) SELECT column FROM database.dbo.table1 WHERE column IS NULL; -- 在这里可以对@TempData中的数据做额外处理 -- 比如:UPDATE @TempData SET TargetCol = 0 WHERE TargetCol IS NULL; -- 最后将处理好的数据批量插入目标表 INSERT INTO database.dbo.table2 (column) SELECT TargetCol FROM @TempData;
可行性说明
完全可行!以上两种方式都是SQL Server官方推荐的批量数据操作方案,在SQL Server 2016中完全支持,而且针对100条数据的场景,性能和效率都远高于你原来的单条处理逻辑。
内容的提问来源于stack exchange,提问作者user8826104
相关产品推荐
相关产品推荐

