0

0

SQLServer添加记录如何实现_SQLServer插入新记录方法

星夢妙者

星夢妙者

发布时间:2025-09-13 11:58:01

|

885人浏览过

|

来源于php中文网

原创

答案:SQL Server中通过INSERT INTO语句插入数据,可结合VALUES、SELECT、BULK INSERT等实现单条、批量或跨表插入;处理约束冲突可用IF NOT EXISTS、MERGE或TRY...CATCH;从查询结果插入使用INSERT INTO ... SELECT,而SELECT INTO则用于创建新表并填充数据。

sqlserver添加记录如何实现_sqlserver插入新记录方法

在SQL Server中添加新记录,核心是通过

INSERT INTO
语句将数据写入到指定的表中。这就像我们往一个空的表格里填写一行新信息,你需要告诉系统你想把什么数据,放到哪个表的哪些列里。

SQL Server中插入新记录的方法主要围绕着

INSERT INTO
语句展开,但具体实现方式则根据数据来源、数量和特殊需求有所不同。

最基础的语法,我想大家应该都见过:

INSERT INTO YourTableName (Column1, Column2, Column3)
VALUES (Value1, Value2, Value3);

这里

YourTableName
是你要操作的表名,括号里是你要插入数据的列名列表。
VALUES
后面跟着的,就是对应列要插入的具体数据。需要注意的是,列的顺序和值的顺序必须一一对应,数据类型也要兼容。

有时候,如果你的

VALUES
列表涵盖了表中的所有列,并且顺序也和表定义时一致,你甚至可以省略列名列表:

INSERT INTO YourTableName
VALUES (Value1, Value2, Value3, ...);

不过,我个人在实际项目中很少推荐这种写法。原因很简单:一旦表的结构发生变化(比如新增或删除了一个列),你的

INSERT
语句就可能出错,或者把数据插到错误的列上。明确指定列名,能让代码更健壮,也更容易理解。

对于那些有

IDENTITY
属性(自增长ID)的列,通常你不需要在
INSERT
语句中为它们提供值,SQL Server会自动生成。如果你尝试为
IDENTITY
列赋值,除非你开启了
SET IDENTITY_INSERT YourTableName ON;
,否则会报错。但通常情况下,我们是让数据库自己管理这些ID的。

比如,有一个

Products
表,包含
ProductID
(IDENTITY),
ProductName
,
Price

INSERT INTO Products (ProductName, Price)
VALUES ('笔记本电脑', 9999.00);

这条语句执行后,

ProductID
会自动生成。如果想获取刚刚插入的
ProductID
,可以使用
SCOPE_IDENTITY()
函数,它能返回当前作用域内最后生成的IDENTITY值,这在需要立即关联新记录的场景下非常有用。

INSERT INTO Products (ProductName, Price)
VALUES ('智能手机', 4999.00);
SELECT SCOPE_IDENTITY() AS NewProductID;

SQL Server中如何安全高效地批量插入多条记录?

在日常开发中,我们很少只插入一条数据,更多时候是需要批量处理。批量插入的效率和安全性是我们需要重点关注的。在我看来,有几种主流的方法,各有侧重:

一种很直接的方式,是利用SQL Server 2008及以后版本支持的

INSERT INTO ... VALUES (), (), ...
语法。这种方式在插入几十到几百条记录时非常方便且性能不错:

INSERT INTO Orders (CustomerID, OrderDate, TotalAmount)
VALUES
(1, GETDATE(), 100.00),
(2, GETDATE(), 250.50),
(1, GETDATE(), 75.20);

这种写法相比多次执行单条

INSERT
语句,减少了与数据库的往返次数,从而提升了效率。

当数据量更大,比如几千上万条时,如果数据源在内存中,可以考虑使用表值参数 (Table-Valued Parameters, TVPs)。TVPs允许你将一个自定义的表类型作为参数传递给存储过程或函数。这在应用程序层构建数据集合,然后一次性传递给数据库进行处理时,效率非常高,而且类型安全。

首先,你需要定义一个表类型:

CREATE TYPE OrderListType AS TABLE
(
    CustomerID INT,
    OrderDate DATETIME,
    TotalAmount DECIMAL(10, 2)
);

然后,在存储过程中使用它:

CREATE PROCEDURE InsertOrdersBatch
    @OrderList OrderListType READONLY
AS
BEGIN
    INSERT INTO Orders (CustomerID, OrderDate, TotalAmount)
    SELECT CustomerID, OrderDate, TotalAmount
    FROM @OrderList;
END;

在应用程序中,你可以构建一个

DataTable
List
,然后将其作为
SqlParameter
传递给存储过程。这种方式避免了字符串拼接,减少了SQL注入风险,并且性能优异。

如果数据源是一个文件(比如CSV或TXT),那么

BULK INSERT
语句或者SQL Server Integration Services (SSIS) 才是真正的利器。
BULK INSERT
可以直接从指定文件路径加载数据到表中,效率极高,因为它绕过了大部分常规的SQL解析和事务开销。

PNG Maker
PNG Maker

利用 PNG Maker AI 将文本转换为 PNG 图像。

下载
BULK INSERT Orders
FROM 'C:\Data\orders.csv'
WITH
(
    FIELDTERMINATOR = ',',  -- 字段分隔符
    ROWTERMINATOR = '\n',   -- 行分隔符
    FIRSTROW = 2            -- 如果文件有标题行,从第二行开始读取
);

这玩意儿在处理百万级别甚至千万级别的数据时,简直是神器。当然,你需要确保SQL Server服务账户有权限访问文件路径。

插入数据时遇到主键冲突、非空约束等错误怎么办?

在数据插入过程中,遇到错误是常有的事。主键冲突、非空约束违反、外键约束失败、数据类型不匹配,这些都是数据库在维护数据完整性时常见的“抱怨”。处理这些错误,关键在于预判和恰当的错误处理机制。

主键冲突 (Primary Key Violation): 这意味着你试图插入一条记录,其主键值已经存在于表中。

  • 预先检查:在执行
    INSERT
    之前,先
    SELECT
    一下,看看这个主键值是否已经存在。如果存在,就更新(
    UPDATE
    )而不是插入,或者直接跳过。
    IF NOT EXISTS (SELECT 1 FROM Users WHERE UserID = @NewUserID)
    BEGIN
        INSERT INTO Users (UserID, UserName) VALUES (@NewUserID, @NewUserName);
    END
    ELSE
    BEGIN
        -- 可以选择更新,或者记录日志
        UPDATE Users SET UserName = @NewUserName WHERE UserID = @NewUserID;
    END;
  • MERGE
    语句 (UPSERT)
    :这是SQL Server 2008引入的一个强大功能,可以根据源表和目标表之间的匹配条件,执行插入、更新或删除操作。它非常适合处理“如果存在就更新,否则就插入”的场景。
    MERGE INTO Products AS Target
    USING (VALUES (101, '新产品A', 150.00)) AS Source (ProductID, ProductName, Price)
    ON Target.ProductID = Source.ProductID
    WHEN MATCHED THEN
        UPDATE SET Target.ProductName = Source.ProductName, Target.Price = Source.Price
    WHEN NOT MATCHED THEN
        INSERT (ProductID, ProductName, Price) VALUES (Source.ProductID, Source.ProductName, Source.Price);

    MERGE
    语句虽然功能强大,但其语法相对复杂,使用时要特别小心,避免不必要的副作用。

非空约束违反 (NOT NULL Constraint Violation): 当表的某一列被定义为

NOT NULL
,但你尝试插入
NULL
值时就会触发。

  • 检查数据源:确保所有
    NOT NULL
    的列都有有效值。
  • 提供默认值:如果业务允许,可以在列定义时设置
    DEFAULT
    值,这样在
    INSERT
    时即使不提供该列的值,数据库也会自动填充。

外键约束违反 (Foreign Key Constraint Violation): 当你试图插入一条记录,其外键值在关联的父表中不存在时发生。

  • 确保父记录存在:在插入子表记录之前,确保其引用的父表记录已经存在。
  • 事务处理:如果涉及多表操作,将它们包装在一个事务中,如果任何一步失败,整个事务回滚,保持数据一致性。

数据类型不匹配 (Data Type Mismatch): 尝试将不兼容的数据类型插入到列中,比如将字符串“abc”插入到

INT
类型的列。

  • 数据清洗和转换:在插入前对数据进行严格的验证和类型转换。使用
    CAST
    CONVERT
    函数进行显式转换。
  • TRY_CAST
    /
    TRY_CONVERT
    :SQL Server 2012+ 提供了
    TRY_CAST
    TRY_CONVERT
    ,它们在转换失败时返回
    NULL
    而不是报错,这对于处理可能有脏数据的情况非常有用。

错误处理机制: 在存储过程或批处理脚本中,使用

TRY...CATCH
块是捕获和处理错误的最佳实践。

BEGIN TRY
    INSERT INTO SomeTable (Col1) VALUES ('Value1');
    INSERT INTO SomeTable (Col1) VALUES (NULL); -- 这会触发非空约束错误
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
    -- 可以选择回滚事务,记录错误日志,或者采取其他恢复措施
END CATCH;

TRY...CATCH
让你的代码更健壮,能够在出现问题时优雅地处理,而不是直接崩溃。

如何从其他表或查询结果中插入数据到SQL Server?

从其他表或查询结果中插入数据,这是数据迁移、数据归档、报表数据准备等场景的家常便饭。SQL Server提供了非常直观的方式来实现这一点,核心就是

INSERT INTO ... SELECT ...
语句。

这种方式的魅力在于,你可以利用

SELECT
语句的强大查询能力,筛选、转换、聚合数据,然后将结果直接“倾倒”到目标表中。

基本语法是这样的:

INSERT INTO TargetTable (Column1, Column2, Column3)
SELECT SourceColumn1, SourceColumn2, SourceColumn3
FROM SourceTable
WHERE SomeCondition;

这里需要注意的是,

SELECT
语句返回的列数、列的顺序和数据类型必须与
TargetTable
中指定的列(或隐式地,所有列)相匹配。

举个例子,假设我们有一个

SalesArchive
表,想要将
Sales
表中所有2023年之前的销售记录移动过去:

INSERT INTO SalesArchive (SaleID, ProductID, CustomerID, SaleDate, Amount)
SELECT SaleID, ProductID, CustomerID, SaleDate, Amount
FROM Sales
WHERE SaleDate < '2023-01-01';

这不仅插入了数据,通常我们还会紧接着用

DELETE
语句从源表删除这些已归档的记录,以保持源表的精简。

你也可以从多个表联接(JOIN)的结果中插入数据。比如,你想创建一个

CustomerSalesSummary
表,包含客户名和他们的总销售额:

INSERT INTO CustomerSalesSummary (CustomerID, CustomerName, TotalSales)
SELECT c.CustomerID, c.CustomerName, SUM(o.TotalAmount)
FROM Customers c
JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID, c.CustomerName;

这种操作在数据仓库的ETL(抽取、转换、加载)过程中非常常见。

还有一个与

INSERT INTO ... SELECT ...
功能类似但有显著区别的语句是
SELECT INTO
SELECT INTO
不仅会插入数据,它还会创建一个新的表

SELECT SaleID, ProductID, CustomerID, SaleDate, Amount
INTO SalesArchive_2022
FROM Sales
WHERE SaleDate BETWEEN '2022-01-01' AND '2022-12-31';

这条语句会创建一个名为

SalesArchive_2022
的新表,并把2022年的销售数据插入进去。如果目标表已经存在,
SELECT INTO
会报错。所以,
SELECT INTO
更适合于创建临时表、备份表或者从现有数据快速生成新表结构和数据。而
INSERT INTO ... SELECT ...
则用于向一个已存在的表添加数据。

在使用

INSERT INTO ... SELECT ...
处理大量数据时,性能优化同样重要。确保
SELECT
语句高效,有合适的索引支持,并且考虑事务日志的影响。对于非常大的数据集,可以考虑分批插入,或者在低峰期执行,以减少对生产系统的影响。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

727

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

328

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

350

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1243

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

360

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

821

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

423

2024.04.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
黑马云课堂jQuery基础视频教程
黑马云课堂jQuery基础视频教程

共46课时 | 10.1万人学习

Excel 教程
Excel 教程

共162课时 | 14.1万人学习

Go语言web开发--经典项目电子商城
Go语言web开发--经典项目电子商城

共23课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号