管理杂谈OA答疑ERP答疑教程搜索

SELECT INTO vs INSERT INTO SELECT:SQL表复制语句详解


今天我们来聊聊SQL Server中两种常用的表复制语句,让你轻松应对数据复制场景!

一、一句话核心区别

对比项
INSERT INTO SELECT
SELECT INTO
目标表
必须已存在自动创建
适用场景
追加数据到现有表
快速备份、创建新表

二、INSERT INTO SELECT:向已有表插入数据

基本语法

INSERT INTO 目标表(字段1, 字段2)SELECT 字段1, 字段2 FROM 源表

完整示例

-- 1. 创建测试表CREATE TABLE Table1 (a varchar(10), b varchar(10), c varchar(10))CREATE TABLE Table2 (a varchar(10), c varchar(10), d int)GO
-- 2. 插入测试数据INSERT INTO Table1 VALUES('赵''asds''90')INSERT INTO Table1 VALUES('钱''asds''100')INSERT INTO Table1 VALUES('孙''asds''80')GO
-- 3. 复制数据(Table2必须存在)INSERT INTO Table2(a, c, d) SELECT a, c, 5 FROM Table1GO
-- 4. 查看结果SELECT * FROM Table2

实用技巧

-- 插入常量INSERT INTO Table2(a, c, d) SELECT a, c, 100 FROM Table1
-- 带条件复制INSERT INTO Table2(a, c, d) SELECT a, c, 5 FROM Table1 WHERE c > 80

三、SELECT INTO:创建新表并复制数据

基本语法

SELECT 字段1, 字段2 INTO 新表 FROM 源表

完整示例

-- 1. 创建源表CREATE TABLE Table1 (a varchar(10), b varchar(10), c varchar(10))GO
-- 2. 插入测试数据INSERT INTO Table1 VALUES('赵''asds''90')INSERT INTO Table1 VALUES('钱''asds''100')INSERT INTO Table1 VALUES('孙''asds''80')GO
-- 3. 创建新表并复制数据(Table2自动创建)SELECT a, c INTO Table2 FROM Table1GO
-- 4. 查看结果SELECT * FROM Table2

实用技巧

-- 只复制表结构(不复制数据)SELECT * INTO Table2 FROM Table1 WHERE 1=0
-- 创建临时表SELECT a, c INTO #TempTable FROM Table1
-- 跨数据库复制SELECT * INTO OtherDB.dbo.Table2 FROM CurrentDB.dbo.Table1

四、实际应用场景

场景1:数据备份

-- 快速备份SELECT * INTO Table1_Backup_20240317 FROM Table1

场景2:数据归档

-- 归档2023年前数据SELECT * INTO Orders_Archive FROM Orders WHERE OrderDate  '2023-01-01'DELETE FROM Orders WHERE OrderDate  '2023-01-01'

场景3:创建报表

-- 生成月度报表SELECT     YEAR(OrderDate) AS 年份,    MONTH(OrderDate) AS 月份,    SUM(Amount) AS 总金额INTO 月度报表FROM OrdersGROUP BY YEAR(OrderDate), MONTH(OrderDate)

五、性能优化小贴士

1. 批量处理

-- 分批插入避免日志爆满DECLARE @BatchSize INT = 10000WHILE 1=1BEGIN    INSERT INTO Table2    SELECT TOP (@BatchSize*     FROM Table1     WHERE ID NOT IN (SELECT ID FROM Table2)
    IF @@ROWCOUNT  @BatchSize BREAKEND

2. 索引处理

-- SELECT INTO后手动创建索引SELECT * INTO BigTable_Copy FROM BigTableCREATE INDEX IX_Copy_ID ON BigTable_Copy(ID)

六、常见问题处理

1. 处理IDENTITY列

-- 保留IDENTITY属性SELECT IDENTITY(int11AS 新ID, * INTO Table2 FROM Table1

2. 避免主键冲突

-- 只插入不存在的数据INSERT INTO Table2SELECT * FROM Table1 t1WHERE NOT EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.ID = t1.ID)

3. 处理NULL值

-- 使用默认值替代NULLINSERT INTO Table2(col1, col2)SELECT ISNULL(col1, '默认值'), ISNULL(col2, 0FROM Table1

总结

阅读原文:原文链接


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn