sqlserver大容量导入数据时保留标识值

本文介绍如何在SQL Server中使用bcp实用工具、BULKINSERT及OPENROWSET命令大容量导入数据的同时保留标识值。通过示例展示了不同方法的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


可以将包含标识值的数据文件大容量导入到 MicrosoftSQL Server 实例中。默认情况下,将忽略导入的数据文件中标识列的值,SQL Server 自动分配唯一值。这些唯一值基于在表创建期间指定的种子和增量值。

如果该数据文件表中的标识符列不包含值,则使用格式化文件来指定导入数据时应跳过表中的标识符列。SQL Server 自动为此列分配唯一值。

若要防止 SQL Server 在将数据行大容量导入到表中时分配标识值,请使用相应的保留标识命令限定符。在您指定保留标识限定符后,SQL Server 将在该数据文件中使用标识值。这些限定符如下:


命令


保留标识限定符


限定符类型



bcp


-E


开关



BULK INSERT


KEEPIDENTITY


参数



INSERT ...SELECT * FROM OPENROWSET(BULK...)


KEEPIDENTITY


表提示


有关详细信息,请参阅 bcp 实用工具、BULK INSERT (Transact-SQL)、OPENROWSET (Transact-SQL)、INSERT (Transact-SQL)、SELECT (Transact-SQL) 和表提示 (Transact-SQL)。


示例

--------------------------------------------------------------------------------



本主题中的示例使用 INSERT ... SELECT * FROM OPENROWSET(BULK...)且保持默认值不变来大容量导入数据。

示例表


大容量导入示例需要在 dbo 架构下的 AdventureWorks2008R2 示例数据库中创建一个名为 myTestKeepNulls 的表。若要创建此表,请在 SQL Server Management Studio 查询编辑器中,执行以下语句:


复制


USE AdventureWorks2008R2;
GO
SELECT * INTO HumanResources.myDepartment
FROM HumanResources.Department
WHERE 1=0;
GO
SELECT * FROM HumanResources.myDepartment;

作为 myDepartment 基础的 Department 表的 IDENTITY_INSERT 设置为 OFF。因此,必须指定 KEEPIDENTITY 或 -E,才能将数据导入到标识列中。

示例数据文件


大容量导入示例中使用的数据文件包含从本机格式的 HumanResources.Department 表中大容量导出的数据。若要创建数据文件,请在 Microsoft Windows 命令提示符下输入以下内容:


复制


bcp AdventureWorks2008R2.HumanResources.Department out myDepartment-n.Dat -n -T

示例格式化文件


此大容量导入示例使用 XML 格式化文件 myDepartment-f-x-n.Xml,该文件使用本机数据格式。此示例使用 bcp 进行创建,以从 AdventureWorks2008R2 数据库的 HumanResources.Department 表生成此格式化文件。在 Windows 命令提示符下,输入以下内容:


复制


bcp AdventureWorks2008R2.HumanResources.Department format nul -n -x -f myDepartment-f-n-x.Xml -T

有关创建格式化文件的详细信息,请参阅创建格式化文件。

A. 使用 bcp 并保留标识值


下面的示例说明如何在使用 bcp 大容量导入数据时保留标识值。bcp 命令使用格式化文件 myDepartment-f-n-x.Xml,并包含下列开关:


限定符


说明



-E


指定标识列使用数据文件中的标识值。



-T


指定 bcp 实用工具使用可信连接来连接到 SQL Server。


在 Windows 命令提示符下输入。


复制


bcp AdventureWorks2008R2.HumanResources.myDepartment in C:\myDepartment-n.Dat -f C:\myDepartment-f-n-x.Xml -E -T


B. 使用 BULK INSERT 并保留标识值


下面的示例使用 BULK INSERT 将数据从 myDepartment-c.Dat 文件大容量导入到 AdventureWorks2008R2.HumanResources.myDepartment 表中。该语句使用 myDepartment-f-n-x.Xml 格式化文件,并包含 KEEPIDENTITY 选项来确保保留数据文件中的所有标识值。

在 SQL Server Management Studio 查询编辑器中,执行:


复制


USE AdventureWorks2008R2;
GO
DELETE HumanResources.myDepartment;
GO
BULK INSERT HumanResources.myDepartment
FROM 'C:\myDepartment-n.Dat'
WITH (
KEEPIDENTITY,
FORMATFILE='C:\myDepartment-f-n-x.Xml'
);
GO
SELECT * FROM HumanResources.myDepartment;


C. 使用 OPENROWSET 并保留标识值


下面的示例使用 OPENROWSET 大容量行集提供程序将数据从 myDepartment-c.Dat 文件大容量导入到 AdventureWorks2008R2.HumanResources.myDepartment 表中。该语句使用 myDepartment-f-n-x.Xml 格式化文件,并包含 KEEPIDENTITY 提示来确保保留数据文件中的所有标识值。

在 SQL Server Management Studio 查询编辑器中,执行:


复制


USE AdventureWorks2008R2;
GO
DELETE HumanResources.myDepartment;
GO

INSERT INTO HumanResources.myDepartment
with (KEEPIDENTITY)
(DepartmentID, Name, GroupName, ModifiedDate)
SELECT *
FROM OPENROWSET(BULK 'C:\myDepartment-n.Dat',
FORMATFILE='C:\myDepartment-f-n-x.Xml') as t1;
GO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值