SqlBulkCopy大批量数据插入到sql表中

alter TYPE TableType AS TABLE
( Name VARCHAR(50)
, code VARCHAR(50) )
GO

alter PROCEDURE usp_InsertProductionLocation
    @TVP TableType READONLY
    AS
    SET NOCOUNT ON
    if object_id(‘temp‘) is not null
    begin
        drop table temp
    end
        SELECT * into temp FROM  @TVP;
    GO
DECLARE @LocationTVP AS TableType;

INSERT INTO @LocationTVP (Name, code)
    SELECT ‘tom‘,1
   EXEC usp_InsertProductionLocation @LocationTVP;
GO

cs调用

方法一:

 /// <summary>
        ///
        /// </summary>
        /// <param name="connectionString">目标连接字符</param>
        /// <param name="TableName">目标表</param>
        /// <param name="dt">源数据</param>
        private static void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dt)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
                {
                    try
                    {
                        sqlbulkcopy.DestinationTableName = TableName;
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                        }
                        sqlbulkcopy.WriteToServer(dt);
                    }
                    catch (System.Exception ex)
                    {
                        throw ex;
                    }
                }
            }
        }

方法二:通过存储过程插入值,存储过程见上面的的sql语句

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("name"));
            dt.Columns.Add(new DataColumn("code"));
            for (int i = 0; i < 20; i++)
            {
                dt.Rows.Add(i.ToString(),i);
            }

            string strCon = @"Server=.;database=MyDb;uid=sa;pwd=sa;";
            SqlBulkCopyByDatatableProc(strCon, "usp_InsertProductionLocation", dt);
  private static void SqlBulkCopyByDatatableProc(string connectionString, string ProcName, DataTable dt)
        {
            using (var conn = new SqlConnection(connectionString))
            {
                conn.Open();
                //// Invokes the stored procedure.
                using (var cmd = new SqlCommand(ProcName, conn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    //// Adding a "structured" parameter allows you to insert tons of data with low overhead
                    var param = new SqlParameter("@TVP", SqlDbType.Structured) { Value = dt };
                    cmd.Parameters.Add(param);
                    cmd.ExecuteNonQuery();
                }
            }
        }
时间: 2024-10-12 04:46:59

SqlBulkCopy大批量数据插入到sql表中的相关文章

mybatis 多条数据插入,判断表中是否含有将插入的数据,插入没有的数据。

多条数据,需要条件筛选之后插入到数据表: <insert id="insertExpectCardLabelInfo" parameterType="java.util.List">//插入表字段 INSERT INTO expect_know_label ( expect_know_label_id, user_id, expect_know_label_data_id, del_flag, create_time, create_user, upda

spark 分析sql内容再插入到sql表中

package cn.spark.study.core.mycode_dataFrame; import java.sql.DriverManager;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD

C# 将DataTable表中的数据批量插入到数据库表中的方法

C#中有时候需要将内存中的数据批量插入到数据库表中,使用for循环进行批量插入不但耗时而且会频繁操作数据库. 针对数据量很少的可以使用for循环插入,但是针对于数据量大的则不推荐使用for循环插入,推荐使用sql的块处理插入. 块处理不但耗时少而且不会频繁对数据库进行操作,只是需要注意的一点是DataTable中的列必须与表的列完全一致. 如下代码是批量插入的一个函数,自测可用. 1 #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 2 /// <summa

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT is SELECT ID,UNAME from g_users where utype=2 and STATUS>-1; begin for c in TABLE_DEPT loop INSERT INTO G_KNOWDOCRIGHT(RID,DIRID,DOCID,USERID) VALUES(SYS

新建表需要原表的数据,mysql 如何把查询到的结果插入到新表中

1. 如果两张张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO  目标表  SELECT  * FROM  来源表 ; 例如,要将 articles 表插入到 newArticles 表中,则可以通过如下SQL语句实现: INSERT INTO  newArticles  SELECT  * FROM  articles ; 2. 如果只希望导入指定字段,可以用这种方法: INSERT INTO  目标表 (字段1, 字段2, ...)  SELE

mysql从一个表中拷贝数据到另一个表中sql语句

这一段在找新的工作,今天面试时,要做一套题,其中遇到这么一句话,从一个表中拷贝所有的数据到另一个表中的sql是什么? 原来我很少用到,也没注意过这个问题,面试后我上网查查,回来自己亲手写了写,测试了下,确实有的.现在我记录下. 这个语句是:insert into A select * from B;这个语句根据需要变化,字段一定要一致: 另一种是MySQL复制表结构及数据到新表:CREATE TABLE 新表 SELECT * FROM 旧表;例子sql语句:CREATE TABLE new_t

使用SqlBulkCopy导入数据至MS SQL Server

原文:使用SqlBulkCopy导入数据至MS SQL Server Insus.NET一直使用表类型来数据入MS SQL Server.参考<存储过程参数为DataTable>http://www.cnblogs.com/insus/archive/2012/09/22/2698515.html .今天学习一个SqlBulkCopy来把数据导入MS SQL Server中去.就是这个<读取XML某一节点>http://www.cnblogs.com/insus/p/3778256

.net使用SqlBulkCopy导入数据(创建新表)

原文:.net使用SqlBulkCopy导入数据(创建新表) .net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高. 包装了一个简单的sqlbulkcopy类,用于数据从datatable导入到sqlserver.代码如下: /// <summary> /// 将DataTable写入数据库的表中 /// </summary> /// <param name="source">数据源DataT

VBS将本地的Excel数据导入到SQL Server中

最近有个测试,需要将本地的Excel数据导入到SQL Server中,所以就写了一个这个脚本,供有需要的同学进行参考.因为在此演示测试,所以准备的数据都比较简单. 我们准备将本地的Excel的A列插入到数据库中的Username列 首先准备本地的Excel数据 然后准备数据库及表结构 开始上脚本 Dim DB,objRecordSet Dim Excel 'SQL Server服务器地址 Dim SQLserver 'SQL Server 数据库 Dim Database 'SQL Server