怎样向SQL Server中大批量插入数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样向SQL Server中大批量插入数据相关的知识,希望对你有一定的参考价值。

参考技术A 一次性插入大量数据,只能使用循环,
如:游标,while 循环语句
下面介绍While 循环插入数据,
SQL 代码如下:
IF OBJECT_ID('dbo.Nums') IS NOT NULL
DROP TABLE dbo.Nums;
GO
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 5000000;
SET @rc = 1;
INSERT INTO Nums VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
--以上函数取自Inside SQL Server 2005: T-SQL Query一书。
INSERT dbo.Sample SELECT n, RAND(CAST(NEWID() AS BINARY(16))) FROM Nums
参考技术B

SQLSERVER可以通过BULK INTO将TXT、CSV的数据高效的导入到数据库

语法:

BULK INSERT CSVTable
FROM 'D:\\csv.txt'
WITH(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\\n'
)

批量从 SQL Server 检索数据

【中文标题】批量从 SQL Server 检索数据【英文标题】:Retrieving data from SQL server in batches 【发布时间】:2011-11-05 22:03:45 【问题描述】:

我有一个 Silverlight Web 应用程序。

我正在将记录插入到从 csv 文件加载的表(SQL 数据库)中。 我尝试加载 +- 15 000 条记录,但出现以下错误: 远程服务器返回错误:NotFound。

我认为这是因为一次插入的数据太多,因为当我将它分成“批次”时,比如一次 100 个,它没有问题地插入到表中。一次500个也太多了。

将数据插入表后,我会从同一个表中读取数据并将其放入数据网格中。这样用户就可以看到它已成功插入,并在处理插入的记录时进行监控。

现在显然我在尝试将 15000 +- 记录加载回数据网格时遇到了同样的错误。

我的问题是如何分批读取表中的记录?

希望有人能提供帮助。

非常感谢,

尼尔

编辑

为了测试我对 OperationContract 进行了更改:

原来

[OperationContract]
public List<send_box> GetSendingItems()

    return (from a in smsData.send_boxes
            orderby a.sb_log descending
            select a).ToList();

改成

[OperationContract]
public List<send_box> GetSendingItems()

    List<send_box> sendBoxList = (from a in smsData.send_boxes
            orderby a.sb_log descending
            select a).ToList();

    return sendBoxList;

结果是从数据库返回的,但是当我尝试将它返回给应用程序时: --> 返回发送框列表

然后它抛出“远程服务器返回错误:未找到。”错误。希望这些额外的信息会有所帮助

问候

尼尔

【问题讨论】:

【参考方案1】:

根据您发布的有限错误消息,我不确定这是否是您的确切问题(堆栈跟踪有助于更好地诊断此问题),但我假设您正在使用 WCF 服务将数据传递给数据库并返回,并且该服务设置了最大消息大小,您需要增加该最大消息大小以允许传递更大量的数据。这是一篇讨论这个的文章wcf-how-to-increase-message-size-quota

【讨论】:

是的,我正在使用 WCF 服务,但已经尝试增加邮件大小配额但无济于事。虽然不太确定一件事。我在Web.config 中添加了basicHttpBinding,但是已经有了customBinding。那个自定义绑定也应该保留吗?【参考方案2】:

我不确定您的确切业务需求是什么。但是根据您的一个回复,您说用户 wnats 可以查看所有记录。如果所有 15,000 条记录都失败,我不确定用户能做什么。可能最好显示一种总结,比如说 15000、10000 通过和 5000 失败。并提供向下钻取或导航链接以探索成功或失败记录。

其次,即使用户想要查看所有记录,我认为在网格中显示超过 100 条记录对用户来说并不友好。 100对我来说也太高了。您可以实现分页功能来限制网格中显示的记录数。

【讨论】:

如果我理解正确,那么分页功能将意味着显示一定数量的记录,如果用户向下滚动,则获取下一个“记录数”并显示这些记录。如果我理解正确,那么这绝对没问题。您能否为我指出如何实施这种解决方案的正确方向。谢谢 看这里:***.com/questions/4578781/… 你可以看看这篇文章,它提供了关于 Silverlight 数据网格中分页排序等的深入知识codeproject.com/Articles/83906/…【参考方案3】:

这看起来像是使用SqlBulkCopy 之类的批量插入机制执行的工作(工作流程:将 csv 文件传输到服务器,建立数据表或其他东西并一次性插入)。无论如何,使用批处理是一个好主意,例如一次 1000 个项目应该不是问题。

旁注:你到底为什么要在一个网格中显示 15000 条记录?没有意义...例如不是更好吗?显示最后插入的 10 条记录以及总数?

【讨论】:

用户需要查看数据库中的触发器正在处理的所有记录。我已将其设置为一次插入 100 个,这工作正常,但我如何读取 100,返回那些 100,读取下一个 100,返回那些等 @Neill - 根据我的说法,您需要先在客户端阅读意味着 .net 端并显示在您在数据集(XML)中获得的数据网格中,然后您就可以从数据集中处理它容易。我遇到了这个问题,我得到了这种类型的解决方案,所以试试这个。这件事会减少你的数据库调用。检查此链接这是我自己的尝试 - sqlmca.wordpress.com/2009/07/29/…

以上是关于怎样向SQL Server中大批量插入数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql存储过程怎样批量插入数据

在mapper映射文件中批量插入数据的sql语句该怎么写?以及怎样在sql语句中接收list集合参数?

sql server有批量插入和批量更新的sql语句吗

SQL Server 批量导入大数据

SQL Server 批量插入数据的两种方法 - 转

SQL Server 批量插入数据的两种方法