SQL Server数据插入全指南:基础语法、安全写法与批量技巧
掌握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插入数据技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









