BULK INSERT 大批量数据

本文介绍 SQL Server 中 BULKINSERT 命令的详细用法,包括各种参数设置及示例,帮助读者理解如何高效地从外部文件批量导入数据。

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

BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_name' FROM 'data_file' }
[ WITH ( [ BATCHSIZE [ = batch_size ] ] [ [ , ] CHECK_CONSTRAINTS ] [ [ , ] CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ] ] [ [ , ] DATAFILETYPE [ = { 'char' | 'native'| 'widechar' | 'widenative' } ] ] [ [ , ] FIELDTERMINATOR [ = 'field_terminator' ] ] [ [ , ] FIRSTROW [ = first_row ] ] [ [ , ] FIRE_TRIGGERS ] [ [ , ] FORMATFILE = 'format_file_path' ] [ [ , ] KEEPIDENTITY ] [ [ , ] KEEPNULLS ] [ [ , ] KILOBYTES_PER_BATCH [ = kilobytes_per_batch ] ] [ [ , ] LASTROW [ = last_row ] ] [ [ , ] MAXERRORS [ = max_errors ] ] [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] [ [ , ] ROWS_PER_BATCH [ = rows_per_batch ] ] [ [ , ] ROWTERMINATOR [ = 'row_terminator' ] ] [ , [ TABLOCK ] ] ) ]
参数
'database_name' 是包含指定表或视图的数据库的名称。如果未指定,则系统默认为当前数据库。
'owner' 是表或视图所有者的名称。当执行大容量复制操作的用户拥有指定的表或视图时,owner 是可选项。如果没有指定 owner 并且执行大容量复制操作的用户不拥有指定的表或视图,则 Microsoft® SQL Server™ 将返回错误信息并取消大容量复制操作。 'table_name' 是大容量复制数据于其中的表或视图的名称。只能使用那些所有的列引用相同基表所在的视图。有关向视图中复制数据的限制的更多信息,请参见 INSERT。
'data_file' 是数据文件的完整路径,该数据文件包含要复制到指定表或视图的数据。BULK INSERT 从磁盘复制数据(包括网络、软盘、硬盘等)。 data_file 必须从运行 SQL Server 的服务器指定有效路径。如果 data_file 是远程文件,则请指定通用命名规则 (UNC) 名称。 BATCHSIZE [ = batch_size ] 指定批处理中的行数。每个批处理作为一个事务复制至服务器。SQL Server提交或回滚(在失败时)每个批处理的事务。默认情况下,指定数据文件中的所有数据是一个批处理。 CHECK_CONSTRAINTS 指定在大容量复制操作中检查 table_name 的任何约束。默认情况下,将会忽略约束。
CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ] 指定该数据文件中数据的代码页。仅当数据含有字符值大于 127 或小于 32 的 char、varchar 或 text 列时,CODEPAGE 才是适用的。 CODEPAGE 值 描述 ACP char、varchar 或 text 数据类型的列从 ANSI/Microsoft Windows® 代码页 ISO 1252 转换为 SQL Server 代码页。 OEM(默认值) char、varchar 或 text 数据类型的列被从系统 OEM 代码页转换为 SQL Server 代码页。 RAW 并不进行从一个代码页到另一个代码页的转换;这是最快的选项。 code_page 特定的代码页号码,例如 850。 DATAFILETYPE [ = {'char' | 'native' | 'widechar' | 'widenative' } ] 指定 BULK INSERT 使用指定的默认值执行复制操作。 DATAFILETYPE 值 描述 char(默认值) 从含有字符数据的数据文件执行大容量复制操作。 native 使用 native(数据库)数据类型执行大容量复制操作。要装载的数据文件由大容量复制数据创建,该复制是用 bcp 实用工具从 SQL Server 进行的。 widechar 从含有 Unicode 字符的数据文件中执行大容量复制操作。 widenative 执行与 native 相同的大容量复制操作,不同之处是 char、varchar 和 text 列在数据文件中存储为 Unicode。要装载的数据文件由大容量复制数据创建,该复制是用 bcp 实用工具从 SQL Server 进行的。该选项是对 widechar 选项的一个更高性能的替代,并且它用于使用数据文件从一个运行 SQL Server 的计算机向另一个计算机传送数据。当传送含有 ANSI 扩展字符的数据时,使用该选项以便利用 native 模式的性能。
FIELDTERMINATOR [ = 'field_terminator' ] 指定用于 char 和 widechar 数据文件的字段终止符。默认的字段终止符是 /t(制表符)。
FIRSTROW [ = first_row ] 指定要复制的第一行的行号。默认值是 1,表示在指定数据文件的第一行。 FIRE_TRIGGERS 指定目的表中定义的任何插入触发器将在大容量复制操作过程中执行。如果没有指定 FIRE_TRIGGERS,将不执行任何插入触发器。 FORMATFILE [ = 'format_file_path' ] 指定一个格式文件的完整路径。格式文件描述了含有存储响应的数据文件,这些存储响应是使用 bcp 实用工具在相同的表或视图中创建的。格式文件应该用于以下情况: 数据文件含有比表或视图更多或更少的列。 列使用不同的顺序。 列分割符发生变化。 数据格式有其它的改变。通常,格式文件通过 bcp 实用工具创建并且根据需要用文本编辑器修改。有关更多信息,请参见 bcp 实用工具。
KEEPIDENTITY 指定标识列的值存在于导入文件中。如果没有指定 KEEPIDENTITY,在导入的数据文件中此列的标识值将被忽略,并且 SQL Server 将根据表创建时指定的种子值和增量值自动赋给一个唯一的值。假如数据文件不含该表或视图中的标识列,使用一个格式文件来指定在导入数据时,表或视图中的标识列应被忽略;SQL Server 自动为此列赋予唯一的值。有关详细信息,请参见 DBCC CHECKIDENT。
KEEPNULLS 指定在大容量复制操作中空列应保留一个空值,而不是对插入的列赋予默认值。 KILOBYTES_PER_BATCH [ = kilobytes_per_batch ] 指定每个批处理中数据的近似千字节数(KB)。默认情况下,KILOBYTES_PER_BATCH 未知。
LASTROW [ = last_row ] 指定要复制的最后一行的行号。默认值是 0,表示指定数据文件中的最后一行。 MAXERRORS [ = max_errors ] 指定在大容量复制操作取消之前可能产生的错误的最大数目。不能被大容量复制操作导入的每一行将被忽略并且被计为一次错误。如果没有指定 max_errors,默认值为 0。 ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) 指定数据文件中的数据如何排序。如果装载的数据根据表中的聚集索引进行排序,则可以提高大容量复制操作的性能。如果数据文件基于不同的顺序排序,或表中没有聚集索引,ORDER 子句将被忽略。给出的列名必须是目的表中有效的列。默认情况下,大容量插入操作假设数据文件未排序。 n 是表示可以指定多列的占位符。
ROWS_PER_BATCH [ = rows_per_batch ] 指定每一批处理数据的行数(即 rows_per_bacth)。当没有指定 BATCHSIZE 时使用,导致整个数据文件作为单个事务发送给服务器。服务器根据 rows_per_batch 优化大容量装载。默认情况下,ROWS_PER_BATCH 未知。 ROWTERMINATOR [ = 'row_terminator' ] 指定对于 char 和 widechar 数据文件要使用的行终止符。默认值是 /n(换行符)。 TABLOCK 指定对于大容量复制操作期间获取一个表级锁。如果表没有索引并且指定了 TABLOCK,则该表可以同时由多个客户端装载。默认情况下,锁定行为是由表选项 table lock on bulk load 决定的。只在大容量复制操作期间控制锁会减少表上的锁争夺,极大地提高性能。 注释 BULK INSERT 语句能在用户定义事务中执行。对于一个用 BULK INSERT 语句和 BATCHSIZE 子句将数据装载到使用多个批处理的表或视图中的用户定义事务来说,回滚它将回滚所有发送给 SQL Server 的批处理。 权限 只有 sysadmin 和 bulkadmin 固定服务器角色成员才能执行 BULK INSERT。 示例 本例从指定的数据文件中导入订单详细信息,该文件使用竖杠 (|) 字符作为字段终止符,使用 |/n 作为行终止符。

BULK INSERT Northwind.dbo.[Order Details] FROM 'f:/orders/lineitem.tbl' WITH ( FIELDTERMINATOR = '|', ROWTERMINATOR = '|/n' )

本例指定 FIRE_TRIGGERS 参数。

BULK INSERT Northwind.dbo.[Order Details] FROM 'f:/orders/lineitem.tbl' WITH ( FIELDTERMINATOR = '|', ROWTERMINATOR = ':/n', FIRE_TRIGGERS )
### 回答1: eff bulk insert(大规模批量插入)是一种高效的数据插入方法,特别适用于需要批量插入大量数据的场景。它的主要特点是通过一次性插入多条记录,减少了数据库的访问次数和网络传输时间,从而提高了插入数据的效率。 使用eff bulk insert可以显著减少数据插入的时间和资源消耗。与传统的逐条插入方式相比,它可以减少对数据库的频繁访问,从而减少了插入数据的时间。使用eff bulk insert还可以减少网络传输时间,因为一次性插入多条记录可以通过一次网络传输完成。 在使用eff bulk insert时,需要准备一个数据集,该数据集包含要插入的多条记录。可以使用CSV文件、Excel文件或其他数据格式来存储这些记录。然后,通过使用数据库提供的API或工具,将数据集一次性插入到数据库中。 使用eff bulk insert需要考虑一些因素。首先,需要确保数据集的准确性和完整性,因为一次性插入可能会导致无法恢复的数据损失。其次,需要根据数据库的要求和限制来调整数据集的大小,以避免超出数据库的容量或性能限制。最后,需要根据实际情况考虑使用并发处理等优化技术,以进一步提高插入数据的效率。 总之,eff bulk insert是一种高效的数据插入方法,可以显著提高大规模批量插入数据的效率。通过一次性插入多条记录,减少了对数据库的频繁访问和网络传输时间,从而节省了时间和资源消耗。使用eff bulk insert需要注意数据集的准确性和完整性,调整数据集的大小,并根据需要使用优化技术。 ### 回答2: Ef BulkInsert是Entity Framework (EF) 提供的一种用于批量插入数据的方法。在传统的插入操作中,每次向数据库插入一条记录都需要与数据库建立连接、执行插入操作、关闭连接等一系列操作,这样的方式效率较低。 而Ef BulkInsert可以通过一次性提交多条数据数据库,大大提高了插入数据的效率。它采用批量操作的方式,将多条数据一次性插入到数据库中,减少了连接和关闭连接的次数,提高了数据库操作的性能。 使用Ef BulkInsert的步骤如下: 1. 首先,我们需要安装Entity Framework库并引入相关命名空间。 2. 创建EF的DbContext对象,该对象用于和数据库进行交互。 3. 在DbContext对象中,使用BulkInsert方法,将要插入的数据一次性提交到数据库。 4. 执行BulkInsert操作后,数据将被批量插入到数据库中。 需要注意的是,Ef BulkInsert对于大批量数据插入非常有效,但在小规模的插入任务中,效果可能不如预期。此外,由于批量操作会占用较多的系统资源,因此需要根据具体情况进行合理的调整和使用。 总之,Ef BulkInsert是一种通过批量插入数据的方式来提高插入性能的方法,可以有效减少连接和关闭连接的次数,对于大批量数据插入任务非常实用。 ### 回答3: EF BulkInsert 是 Entity Framework (EF) 中的一个功能,用于批量插入数据数据库中。传统的方法是通过循环遍历每个实体对象并逐个插入到数据库中,这种方式效率较低,尤其是当需要插入大量数据时。 而 EF BulkInsert 则通过内置的高效批量插入算法,能够在一次操作中将多个实体对象一次性插入到数据库中,从而极大地提高了插入数据的速度和效率。 使用 EF BulkInsert 主要包括以下几个步骤: 1. 首先,需要通过 NuGet 包管理器安装 EF BulkInsert 插件。 2. 创建实体对象的列表,将需要插入的数据存储在这个列表中。 3. 调用 EF BulkInsert 插件提供的 API,将实体对象列表作为参数传入,表示将这些实体对象批量插入到数据库中。 4. 执行插入操作后,EF BulkInsert 会自动处理数据库的连接和事务,确保数据的一致性和完整性。 5. 最后,可以根据返回的结果来判断插入是否成功,并进行相应的处理。 EF BulkInsert 在插入大量数据时能够极大地提升性能,减少了循环插入的时间消耗,同时还避免了频繁的数据库连接和事务开启的开销。 需要注意的是,EF BulkInsert 不适用于所有情况,特别是在需要进行复杂数据处理或者需要触发数据库的相关事件时,仍然需要使用传统的逐个插入方式。 总之,EF BulkInsert 是一个高效的批量插入数据的工具,可以在处理大量数据时显著提升性能,提供了更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值