批量插入SQLServer数据:简单Insert与表值参数方法
185 浏览量
更新于2024-08-30
收藏 134KB PDF 举报
在SQL Server中,批量插入大量数据是常见的操作,特别是在数据分析、数据迁移或系统初始化时。本文将介绍两种不同的方法来实现高效的批量插入:标准的INSERT语句和使用表值参数(Table-Valued Parameters,TVP)。
首先,我们创建一个测试环境,包括数据库和表。通过执行以下代码片段,我们可以建立一个名为`BulkTestDB`的数据库,并在其中创建两个表:`BulkTestTable`和`BulkUdt`。`BulkTestTable`用于存储用户信息,包括整数ID、32字符的用户名和16字符的密码;而`BulkUdt`是一个表类型,它定义了与`BulkTestTable`相同的结构,但作为参数传递时更为高效。
```sql
-- 创建数据库
CREATE DATABASE BulkTestDB;
GO
-- 使用数据库
USE BulkTestDB;
GO
-- 创建用户表
CREATE TABLE BulkTestTable (
Id INT PRIMARY KEY,
UserName nvarchar(32),
Pwd varchar(16)
);
-- 创建表值参数
CREATE TYPE BulkUdt AS TABLE (
Id INT,
UserName nvarchar(32),
Pwd varchar(16)
);
```
标准的批量插入方法是使用循环和参数化的`INSERT`语句。例如,以下代码展示了如何插入100万条数据,每批插入10万条,共进行10次循环:
```sql
DECLARE @sw Stopwatch
SET @sw = NEW Stopwatch()
-- 连接到数据库
DECLARE @sqlConn SqlConnection
SET @sqlConn = NEW SqlConnection(ConfigurationManager.ConnectionStrings['ConnStr'].ConnectionString)
-- 定义命令对象
DECLARE @sqlComm SqlCommand
SET @sqlComm = NEW SqlCommand()
SET @sqlComm.CommandText = 'INSERT INTO BulkTestTable (Id, UserName, Pwd) VALUES (@p0, @p1, @p2)'
-- 参数设置
SET @sqlComm.Parameters.AddWithValue('@p0', SqlDbType.Int)
SET @sqlComm.Parameters.AddWithValue('@p1', SqlDbType.NVarChar)
SET @sqlComm.Parameters.AddWithValue('@p2', SqlDbType.VarChar)
SET @sqlComm.CommandType = CommandType.Text
SET @sqlComm.Connection = @sqlConn
BEGIN TRY
-- 开始计时
SET @sw.Start()
-- 循环插入数据
FOR multiply FROM 0 TO 9
BEGIN
FOR count FROM multiply * 100000 TO (multiply + 1) * 100000
BEGIN
SET @sqlComm.Parameters.AddWithValue('@p0', count)
SET @sqlComm.Parameters.AddWithValue('@p1', 'User' + CAST(count AS varchar(10)))
SET @sqlComm.Parameters.AddWithValue('@p2', 'Pwd' + CAST(count AS varchar(10)))
EXECUTE @sqlComm
END
END
-- 记录插入时间
SET @sw.Stop()
END TRY
BEGIN CATCH
-- 错误处理
PRINT 'Error: ' + ERROR_MESSAGE()
END CATCH
-- 关闭连接
CLOSE @sqlConn
DEALLOCATE @sqlComm
```
然而,当处理大量数据时,这种方式可能会受到性能限制。为了解决这个问题,我们可以利用表值参数。通过将数据作为一个表值集传递给存储过程,可以显著提高插入速度。以下是使用TVP的方法:
```sql
-- 假设数据源是一个临时表或已经存在的表
DECLARE @BulkData TABLE (
Id INT,
UserName nvarchar(32),
Pwd varchar(16)
)
INSERT INTO @BulkData
VALUES ...
-- 存储过程接收表值参数
CREATE PROCEDURE InsertBulkUsingTVP (@BulkData BulkUdt READONLY)
AS
BEGIN
INSERT INTO BulkTestTable
SELECT * FROM @BulkData
END
-- 调用存储过程
EXEC InsertBulkUsingTVP @BulkData
```
通过使用表值参数,SQL Server可以在一次操作中处理整个数据集,避免了多次单行插入的开销,从而提高性能。然而,TVP适用于数据已经预处理好的情况,如果数据需要在程序中动态生成,可能需要先临时存储,再调用存储过程。
总结来说,批量插入数据时,可以选择标准的INSERT语句配合循环,适合固定数量的数据插入,或者使用表值参数,适用于大规模数据或预处理的数据集,能有效提升性能。根据具体场景选择合适的方法是关键。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2023-09-02 上传
2020-09-10 上传
2020-09-01 上传
2020-10-28 上传
2020-12-15 上传
2020-12-15 上传
weixin_38689824
- 粉丝: 6
- 资源: 946
最新资源
- 火炬连体网络在MNIST的2D嵌入实现示例
- Angular插件增强Application Insights JavaScript SDK功能
- 实时三维重建:InfiniTAM的ros驱动应用
- Spring与Mybatis整合的配置与实践
- Vozy前端技术测试深入体验与模板参考
- React应用实现语音转文字功能介绍
- PHPMailer-6.6.4: PHP邮件收发类库的详细介绍
- Felineboard:为猫主人设计的交互式仪表板
- PGRFileManager:功能强大的开源Ajax文件管理器
- Pytest-Html定制测试报告与源代码封装教程
- Angular开发与部署指南:从创建到测试
- BASIC-BINARY-IPC系统:进程间通信的非阻塞接口
- LTK3D: Common Lisp中的基础3D图形实现
- Timer-Counter-Lister:官方源代码及更新发布
- Galaxia REST API:面向地球问题的解决方案
- Node.js模块:随机动物实例教程与源码解析