标签: sqlbulkcopy

使用SqlBulkCopy,如何将数据插入到非默认数据库模式的表中?

我需要将数据插入名为Stagingusing 的模式中的表中SqlBulkCopy.

看来API只允许您使用DestinationTableName属性设置目标表名.

我该如何做到这一点?可能吗?

.net schema sqlbulkcopy database-schema

11
推荐指数
1
解决办法
2624
查看次数

从.NET代码插入SQL Server表的最快方法?

最快的方法是:

  • 一个表,没有我无法预填的参考(即那里有一个参考密钥,但我填写了所有数据)
  • 很多数据.我们每天谈论数亿行,通过API动态进行
  • 必须/应该在近乎实时的情况下尽快处理请求(即没有写入文件以便每天上传一个).2秒是正常的最大延迟
  • 用于数据/应用程序和SQL Server的独立机器

我现在应该做什么:

  • 将最多32*1024行聚合到一个数组中,然后对其进行排队.
  • 用2-3个线程读取队列.使用SqlBulkCopy插入数据库.

我每秒输入大约60k-75k行,这还不够,但非常接近.我想要达到250.000行.

到目前为止还没有真正使用过.我得到20%的时间"网络I/O"块,有一个核心80%加载CPU端.光盘写出7mb-14mb,大部分是空闲的.RAID 10上的6个raptors的平均队列长度是...... 0.25.

任何人都知道如何加快速度?更快的服务器(到目前为止它是虚拟的,8GB RAM,4个核心,物理磁盘通过数据).


添加一些说明:

  • 这是2008 R2服务器上的2008 R2 Enterprise SQL Server.机器有4个核心,8gb内存.全64位.平均80%的负载来自这台机器,显示大约20%的CPU负载.
  • 该表很简单,没有主键,只有关系引用(工具引用)上的索引和唯一(在一组工具中,因此不强制执行)时间戳.
  • 上表中的字段包括:时间戳,仪器参照(无强制外键),数据类型(字符1,一个数字,指示帐什么数据字符中的一个),价格(双)和体积(INT).正如您所看到的,这是一张非常薄的桌子.有问题的数据是金融工具的刻度数据.
  • 问题还在于硬件等 - 主要是因为我没有看到真正的瓶颈.我插入多个交易,它给了我一个好处,但一个小的.光盘,CPU没有显示显著负载,网络IO等待高(300毫秒/秒,此刻的30%),但这是它运行仅仅指刚两台服务器,并具有足够的核心来运行所有相同的虚拟化平台上.我几乎愿意"购买另一台服务器",但我想首先确定瓶颈....特别是考虑到在一天结束时我并没有抓住瓶颈是什么.日志记录无关紧要 - 批量插入不会作为数据(没有聚集索引)进入数据日志.

垂直分区是否有助于,例如通过一个字节(tinyint)将仪器世界分开,例如16个表格,因此我最多同时进行16次插入?实际上,数据来自不同的交易所,我可以为每个交易所制作一个分区.这将是一个自然的分裂场(实际上是在乐器中,但我可以在这里复制这些数据).


更多澄清:速度更高(90k),现在明显受到机器之间的网络IO的限制,这可能是VM切换.

我现在要做的就是做每32K行的连接,搭起一个临时表,插入此与SqlBUlkdCopy,然后用一条SQL语句复制到主表 - 在主表最大限度地减少任何锁定时间.

大多数等待时间现在仍在网络IO上.似乎我遇到了VM明智的问题.将在未来几个月转移到物理硬件;)

sqlbulkcopy sql-server-2008

11
推荐指数
1
解决办法
4325
查看次数

无法使用sqlbulkcopy插入数据表

这是我的代码,包含以下列,在DB中,这些列是nvarchars.

SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, 
System.Data.SqlClient.SqlBulkCopyOptions.Default, transaction);

bulkCopy.DestinationTableName = "Test";
bulkCopy.ColumnMappings.Add("Number", "Code");
bulkCopy.ColumnMappings.Add("Type", "Type");
bulkCopy.ColumnMappings.Add("Group", "Group");
bulkCopy.ColumnMappings.Add("Short Text", "ShortText");
bulkCopy.ColumnMappings.Add("Text", "Description");
bulkCopy.WriteToServer(dataTable);
Run Code Online (Sandbox Code Playgroud)

我试图在数据库中插入一个完整的数据表,使用批量复制,但我收到此错误:

数据源中String类型的给定值无法转换为指定目标列的类型nvarchar.

c# sqlbulkcopy

11
推荐指数
1
解决办法
2万
查看次数

SqlBulkCopy如何工作

我熟悉C#SqlBulkCopy类,您可以在其中调用通过DataTable传递的'WriteToServer'方法.

我的问题是SQL服务器中的底层机制用于批量插入数据?

我问的原因是批量插入 MSDN T-SQL帮助文件中引用的批量插入需要导入数据文件.SqlBulkCopy是否创建数据文件?

我想了解这些东西,以确定我是否可以在SQL中使用批量插入功能.

如果我编写一个SQL语句,准备将所有行插入特定表(数千行),我可以将它们批量插入到目标表中吗?这样的事情就是我现在这样做的方式,

INSERT INTO sync_filters (table_name, device_id, road_id, contract_id)
    SELECT * FROM dbo.sync_contract_filters (@device_id)
Run Code Online (Sandbox Code Playgroud)

dbo.sync_contract_filters是一个生成要插入的所有行的函数.这可以批量插入吗?

.net sql-server sqlbulkcopy

11
推荐指数
2
解决办法
5880
查看次数

SqlBulkCopy错误处理/继续错误

我试图将大量数据插入SQL服务器.我的目标表有一个名为"Hash"的唯一索引.

我想用SqlBulkCopy替换我的SqlDataAdapter实现.在SqlDataAapter中有一个名为"ContinueUpdateOnError"的属性,当设置为true时,adapter.Update(table)将插入所有可能的行,并使用RowError属性标记错误行.

问题是我如何使用SqlBulkCopy尽可能快地插入数据,同时跟踪哪些行被插入以及哪些行没有(由于唯一索引)?

以下是其他信息:

  1. 该过程是迭代的,通常按计划重复进行.

  2. 源表和目标表可能很大,有时可能有数百万行.

  3. 即使可以首先检查哈希值,但每行需要两个事务(首先从目标表中选择哈希,然后执行插入).我认为在adapter.update(table)的情况下,检查RowError比检查每行的哈希命中要快.

c# ado.net sqlbulkcopy

10
推荐指数
1
解决办法
2万
查看次数

回滚批量复制

我有一个应用程序,通过c#中的批量复制类从我的数据库中复制.

发生异常时,我可以在sql server中回滚批量复制操作吗?

c# sql-server bcp sqlbulkcopy rollback

10
推荐指数
1
解决办法
6418
查看次数

SqlBulkCopy:传递SqlBulkCopyOptions.UseInternalTransaction和不传递它有什么区别?

我试图找到使用SqlBulkCopy与SqlBulkCopyOptions.UseInternalTransaction复制选项和没有它之间的区别,但在我的测试应用程序中,我没有发现任何差异.如果BatchSize是例如0并且我添加了100条记录(在a中DataTable),其中记录号50在将其添加到数据库表时导致错误,我在表中得到0条记录.BatchSize例如,如果设置为10,则会获得40条记录(4批10条记录,第5批包含错误记录并导致批量复制中止).如果qlBulkCopyOptions.UseInternalTransaction设置了S无关紧要,我总能得到相同的结果.看起来批次总是复制在内部事务中.

如果您对我的测试应用程序感兴趣,那么它是:SqlBulkCopy-Error-and-Transaction-Test.zip

我的问题是:

  1. 是否SqlBulkCopyOptions.UseInternalTransaction过时因为SqlBulkCopy总是使用内部交易?
  2. 如果不是:这个选项的实际含义是什么?在哪些情况下它会有所作为?

希望有人能澄清一下

编辑: 根据答案和评论我认为我的问题不够明确.我知道文档.它说"默认情况下,批量复制操作是它自己的事务." 并且每个批次在传递时都使用它自己的事务UseInternalTransaction.但是,如果这意味着默认情况下,批量复制操作仅对整个批量复制使用一个事务(而不是每个批次一个),如果我将BatchSize设置为特定大小并且后面的批处理,则不会在数据库中获取记录第一个导致错误.如果仅使用一个事务,则将回滚添加到事务日志中的所有记录.但是我得到了包含错误记录的批次之前的批次记录.根据这一点,似乎默认情况下每个批次都在它自己的事务中执行.这意味着我是否通过没有任何区别UseInternalTransaction.如果我走错了路,我真的很感激,如果有人能澄清的话.

一个事实可能很重要:我使用的是SQL Server 2012.也许SQL Server 2008的行为有所不同.我会检查一下.

编辑:感谢usr的回复,我想我找到了答案:我调试了一下,发现如果没有定义UseInternalTransaction,私有字段_internalTransaction真的没有设置.然后,SqlBulkCopy不使用自己的(内部)事务.但是分析表明SqlBulkCopy使用TDS(表格数据流)来复制数据(无论BatchSize是什么).我没有找到关于TDS的更多信息,特别是对于SQL Server,但我假设SQL Server在内部事务中执行TDS批量复制操作.因此,对于SQL Server来说,UseInternalTransaction似乎是多余的,但为了安全起见,我会设置它.

.net windows sql-server sqlbulkcopy

10
推荐指数
1
解决办法
4856
查看次数

如何将CsvHelper记录添加到DataTable以用于SqlBulkCopy到数据库

我试图用CsvHelper读取CSV文件,将每个记录加载到DataTable,然后使用SqlBulkCopy将数据插入数据库表.使用当前代码,在向DataTable添加行时会出现异常.例外情况是:"无法将'MvcStockAnalysis.Models.StockPrice'类型的对象强制转换为'System.IConvertible'.不能存储在日期列中.预期的类型是DateTime."

示例CSV文件来自yahoo finance.例如:http://ichart.yahoo.com/table.csv?s = MMM&a = 0&b = 1&c = 2010&d = 0&e = 17&f = 2014&g = d&signore = .cv

CSV文件包含以下标题:日期打开高低关闭音量调整关闭

我正在将CSV文件读入的模型:

namespace MvcStockAnalysis.Models
{
    using System;
    using System.Collections.Generic;

    public partial class StockPrice
    {
        public int Id { get; set; }
        public System.DateTime Date { get; set; }
        public int CompanyId { get; set; }
        public double High { get; set; }
        public double Low { get; set; }
        public double Close { get; set; } …
Run Code Online (Sandbox Code Playgroud)

.net csv datatable sqlbulkcopy csvhelper

10
推荐指数
3
解决办法
1万
查看次数

使用SQLBulkCopy插入/更新数据库

我有一个带记录的数据表.我正在使用SqlBulkCopy将记录插入到Sql表中.它运行正常.下一次获取具有相同记录且几乎没有更改值的数据表时,SqlBulkCopy正在插入另一组记录而不更新以前的详细信息.如何我可以使用SqlBulkCopy更新Sql表吗?请帮忙.

谢谢,Vix

asp.net sqlbulkcopy

9
推荐指数
1
解决办法
1万
查看次数

如何使用SQL批量复制获取插入数据记录的标识

我有一个DataTable大约有100,000条记录的ADO.NET .在此表中有一列 xyID没有值,因为该列是IDENTITY在我的SQL Server数据库中自动生成的.

我需要为其他进程检索生成的ID.我正在寻找一种方法来批量复制DataTable到SQL Server数据库,并在相同的"步骤"内"填充"我DataTable生成的ID.

如何使用SqlBulkCopy类检索插入表中的记录的标识值?

database sql-server ado.net identity sqlbulkcopy

9
推荐指数
1
解决办法
3462
查看次数