SQL Server数据插入全指南:基础语法、安全写法与批量技巧

林见深
林见深
发布时间:2026-10-15 | 4人浏览过
原创

掌握SQL Server数据插入是数据库开发的基础技能。本文系统梳理了INSERT语句的安全写法与基础用法,对比了直接VALUES插入与指定列名的差异;深入解析SELECT INTO的表创建与复制机制,并提供了基于WHILE循环的大规模数据批量插入方案,帮助开发者规避常见错误并提升数据操作效率。

准备工作:构建测试环境

为了清晰展示不同插入方式的效果,我们需要先在数据库中创建两张具有相同结构的示例表。在执行后续操作前,请先运行以下初始化代码:

create table 学生表01(
姓名 nvarchar(10),
性别 nvarchar(1),
身高 numeric(3,2)
)

create table 学生表02(
姓名 nvarchar(10),
性别 nvarchar(1),
身高 numeric(3,2)
)

第1步:使用基本 INSERT 语法插入完整行

这是插入数据最直观的方法,即向表中所有列提供对应的值。

1.1 不指定列名的插入(风险较高)

在values子句中按表定义顺序逐列给出值。若某列无值,需传入NULL(前提是表允许为空)。

insert into 学生表01
values('李明','男','1.70')

执行成功后,查询验证:

select *from 学生表01

如果中间某列需要留空:

insert into 学生表01
values('李红',null,'1.69')
此方式极度依赖表定义的字段顺序。一旦开发人员修改了表结构(如增减或调换列位置),此语句将直接报错或导致数据错位,不建议在生产环境中使用。

1.2 指定列名的插入(推荐安全写法)

在表名后明确括号列出目标列,这是更健壮的做法。即使表结构变化,只要列名存在即可正确匹配。

insert into 学生表01(姓名,性别,身高)
values('李亮','女','1.60')

高级技巧:列的顺序可以与表定义不一致,只需保证values中的值与列名一一对应即可:

insert into 学生表01(性别,姓名,身高)
values('女','小红','1.55')

第2步:插入部分行(处理缺省字段)

当只填写部分字段时,必须确保未填写的列满足以下条件之一:
1. 定义为允许NULL值;
2. 在表定义时设置了默认值。
否则数据库将拒绝执行并抛出错误。

例如省略“身高”字段:

insert into 学生表01(性别,姓名)
values('女','大红')

结果中未提供值的身高列自动填充为NULL。

第3步:从检索结果中插入数据 (Insert Select)

可以使用SELECT语句的结果集来填充新表的数据。这常用于备份或数据迁移。

insert into 学生表02(性别,姓名,身高)
select 性别,姓名,身高
from 学生表01

随后查询表02:

select *from 学生表02

注意:此时INSERT的目标表必须已经存在。可以在SELECT中添加WHERE子句以过滤需要导入的数据。

第4步:复制表结构与数据 (Select Into)

如果在SELECT语句中使用INTO关键字,SQL Server会自动创建一个全新的表并将查询结果存入其中。

4.1 复制整表

select *into 学生表 from 学生表01
select *from 学生表

4.2 仅复制指定列

select 姓名 into 学生表03 from 学生表01
select *from 学生表03

重要区别:INSERT SELECT是将数据塞入已有表;SELECT INTO则是先建表再填数。

补充:大规模数据的循环批量插入

在实际业务中,经常需要生成大量模拟数据用于压测或初始化。下面展示如何使用T-SQL的WHILE循环结合NEWID()生成UUID主键进行高效批量插入:

DECLARE @Count INT;
DECLARE @BuildingId VARCHAR(16);
DECLARE @FloorId VARCHAR(16);
DECLARE @RoomId VARCHAR(16);
DECLARE @RoomName NVARCHAR(20);
DECLARE @Name NVARCHAR(20);
BEGIN
    SET @Count = 1;
    -- 设置固定的关联ID与名称模板
    SET @BuildingId = '0000000000000999';
    SET @FloorId = '0000000000000999';
    SET @RoomId = '0000000000009999';
    SET @RoomName = N'999';
    SET @Name = N'999';

    -- 循环次数
    WHILE @Count <= 180
    BEGIN
        INSERT INTO dbo.Xq_Bed
        (
            Id,
            BuildingId,
            FloorId,
            RoomId,
            RoomName,
            Name,
            Status,
            CreateTime,
            IsDeleted
        )
        VALUES
        (
          NEWID(), 
          @BuildingId, 
          @FloorId, 
          @RoomId, 
          @RoomName, 
          @Name + '-' + CAST(@Count AS VARCHAR), 
          99, 
          SYSDATETIME(),
          0  );
        SET @Count = @Count + 1;
    END;
END;

该脚本通过递增序号拼接房间名称,并利用系统函数SYSDATETIME()记录时间,非常适合自动化脚本场景。

总结

以上就是SQL Server如何插入数据的详细内容,更多关于SQL Server插入数据技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表