sql下三种批量插入数据的方法

2023年 4月 18日 45.8k 0

本文将介绍三种批量插入数据的方法。第一种方法是使用循环语句逐个将数据项插入到数据库中;第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表;第

本文将介绍三种批量插入数据的方法。第一种方法是使用循环语句逐个将数据项插入到数据库中;第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表;第三种使用的方法是sql server中的表值参数方法,表值参数是 SQL Server 2008 中的新参数类型。表值参数是使用用户定义的表类型来声明的。使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据。

      代码示例:

      此例子为控制台输出程序,有两个类,一个为BulkData类,主要实现了表值参数和sqlbulkcopy是如何插入数据的,一个类为Repository,一个app.config配置文件。所用数据库为sql server 2012。

       建库语句:

复制代码 代码如下:打开 --Create DataBaseuse mastergoif exists(select * from master.sys.sysdatabases where name=N'BulkDB')drop database BulkDBcreate database BulkDB;go

--Create Tableuse BulkDBgo

if exists(select * from sys.objects where object_id=OBJECT_ID(N'[dbo].[BulkTable]') and type in(N'U'))drop table [dbo].BulkTableCreate table BulkTable(Id int primary key,UserName nvarchar(32),Pwd varchar(16))go

--Create Table Valueduse BulkDBgo

if exists(select * from sys.types st join sys.schemas ss on st.schema_id=ss.schema_idwhere st.name=N'[BulkType]' and ss.name=N'dbo')drop type [dbo].[BulkType]go

create type [dbo].[BulkType] as table  (   Id int,   UserName nvarchar(32),   Pwd varchar(16)   )go

select * from dbo.BulkTable

BulkData.cs

复制代码 代码如下:打开 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Configuration;

namespace BulkData{    class BulkData    {        public static void TableValuedToDB(DataTable dt)        {            SqlConnection sqlConn = new SqlConnection(              ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);            const string TSqlStatement =             "insert into BulkTable (Id,UserName,Pwd)" +             " SELECT nc.Id, nc.UserName,nc.Pwd" +             " FROM @NewBulkTestTvp AS nc";            SqlCommand cmd = new SqlCommand(TSqlStatement, sqlConn);            SqlParameter catParam = cmd.Parameters.AddWithValue("@NewBulkTestTvp", dt);

            catParam.SqlDbType = SqlDbType.Structured;            catParam.TypeName = "dbo.BulkType";            try            {                sqlConn.Open();                if (dt != null && dt.Rows.Count != 0)                {                    cmd.ExecuteNonQuery();                }            }            catch (Exception ex)            {                throw ex;            }            finally            {                sqlConn.Close();            }        }

        public static DataTable GetTable()        {            DataTable dt = new DataTable();

            dt.Columns.AddRange(new DataColumn[]{new DataColumn("Id",typeof(int)),new DataColumn("UserName",typeof(string)),new DataColumn("Pwd",typeof(string))});

            return dt;        }

        public static void BulkToDB(DataTable dt)        {            SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);            SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn);            bulkCopy.DestinationTableName = "BulkTable";            bulkCopy.BatchSize = dt.Rows.Count;

            try            {                sqlConn.Open();                if (dt != null && dt.Rows.Count != 0)                    bulkCopy.WriteToServer(dt);            }            catch (Exception ex)            {                throw ex;            }            finally            {                sqlConn.Close();                if (bulkCopy != null)                    bulkCopy.Close();            }        }    }}

Repository.cs

复制代码 代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.Diagnostics;

namespace BulkData{    public class Repository    {        public static void UseSqlBulkCopyClass()        {            Stopwatch sw = new Stopwatch();            for (int outLayer = 0; outLayer < 10; outLayer++)            {                DataTable dt = BulkData.GetTable();                for (int count = outLayer * 100000; count < (outLayer + 1) * 100000; count++)                {                    DataRow r = dt.NewRow();                    r[0] = count;                    r[1] = string.Format("User-{0}", count * outLayer);                    r[2] = string.Format("Password-{0}", count * outLayer);                    dt.Rows.Add(r);                }                sw.Start();                BulkData.BulkToDB(dt);                sw.Stop();                Console.WriteLine(string.Format("{1} hundred thousand data elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds, outLayer + 1));            }

            Console.ReadLine();        }

        public static void UseTableValue()        {            Stopwatch sw = new Stopwatch();

            for (int outLayer = 0; outLayer < 10; outLayer++)            {                DataTable dt = BulkData.GetTable();

                for (int count = outLayer * 100000; count < (outLayer + 1) * 100000; count++)                {                    DataRow dataRow = dt.NewRow();                    dataRow[0] = count;                    dataRow[1] = string.Format("User-{0}", count * outLayer);                    dataRow[2] = string.Format("Password-{0}", count * outLayer);                    dt.Rows.Add(dataRow);                }

                sw.Start();                BulkData.TableValuedToDB(dt);                sw.Stop();

                Console.WriteLine(string.Format("{1} hundred thousand data elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds, outLayer + 1));            }

            Console.ReadLine();        }

        public static void UserNormalInsert()        {            Stopwatch sw = new Stopwatch();

            SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);

            SqlCommand sqlComm = new SqlCommand();            sqlComm.CommandText = string.Format("insert into BulkTable(Id,UserName,Pwd)values(@p0,@p1,@p2)");            sqlComm.Parameters.Add("@p0", SqlDbType.Int);            sqlComm.Parameters.Add("@p1", SqlDbType.NVarChar);            sqlComm.Parameters.Add("@p2", SqlDbType.VarChar);            sqlComm.CommandType = CommandType.Text;            sqlComm.Connection = sqlConn;            sqlConn.Open();

            try            {                for (int outLayer = 0; outLayer < 10; outLayer++)                {                    for (int count = outLayer * 100000; count < (outLayer + 1) * 100000; count++)                    {

                        sqlComm.Parameters["@p0"].Value = count;                        sqlComm.Parameters["@p1"].Value = string.Format("User-{0}", count * outLayer);                        sqlComm.Parameters["@p2"].Value = string.Format("Password-{0}", count * outLayer);                        sw.Start();                        sqlComm.ExecuteNonQuery();                        sw.Stop();                    }

                    Console.WriteLine(string.Format("{1} hundred thousand data elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds, outLayer + 1));                }            }            catch (Exception ex)            {                throw ex;            }            finally            {                sqlConn.Close();            }

            Console.ReadLine();        }    }}

App.config

复制代码 代码如下:<?xml version="1.0" encoding="utf-8" ?><configuration>  <connectionStrings>    <add name="ConnStr"      connectionString="data source=.;Integrated Security=SSPI;Initial Catalog=BulkDB"      providerName="System.Data.SqlClient" />  </connectionStrings></configuration>

 Program.cs

复制代码 代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.Diagnostics;

namespace BulkData{    class Program    {                    static void Main(string[] args)        {            //Repository.UseSqlBulkCopyClass();            Repository.UseTableValue();            //Repository.UserNormalInsert();        }            }}

三种方法分别插入100万条数据所用的时间为:

       循环语句所用时间:

      

        sqlbulkcopy方法所用时间为:

       

         表值参数所用时间为:

        

我不会告诉你有一种sql语法可以这么写:

复制代码 代码如下:insert into SystemSet_tbl (ss_guid,ss_type,ss_comment) values ('00000000-0000-0000-0000-000000000007',1,''),('00000000-0000-0000-0000-000000000008',1,'')

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论