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

在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
INSERT
IDENTITY
SET IDENTITY_INSERT YourTableName ON;
比如,有一个
Products
ProductID
ProductName
Price
INSERT INTO Products (ProductName, Price)
VALUES ('笔记本电脑', 9999.00);这条语句执行后,
ProductID
ProductID
SCOPE_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<T>
SqlParameter
如果数据源是一个文件(比如CSV或TXT),那么
BULK INSERT
BULK INSERT
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
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
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
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
SELECT INTO
SELECT INTO
INSERT INTO ... SELECT ...
在使用
INSERT INTO ... SELECT ...
SELECT
以上就是SQLServer添加记录如何实现_SQLServer插入新记录方法的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                 
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                            Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号