我熟悉C#SqlBulkCopy类,您可以在其中通过数据表调用'WriteToServer'方法。
我的问题是,SQL Server中的哪种底层机制用于批量插入该数据?
我问的原因是Bulk Insert 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)
并且dbo.sync_contract_filters是一个函数,用于生成要插入的所有行。可以批量插入吗?
SqlBulkCopy不会创建数据文件。它使用可用的通信协议(命名管道,TCP / IP等)将数据表直接从.Net DataTable对象流传输到服务器,并使用与BCP相同的技术将数据批量插入目标表。 。
SqlBulkCopy可以使用数据表,IDataReader或DataRow []作为数据源。看一看该类的WriteToServer方法。我发现它是将数据导入SQL Server的相当有用的机制。之前,我已将此与CSVReader结合使用。上一个链接使您了解如何与实现IDataReader的类一起使用。
您可能需要play around with the batch sizes以确保获得期望的性能。
如果要通过快速写入大量数据来获得最佳性能,则MSDN上的The Data Loading Performance Guide是非常有用的资源。它更多地关注诸如BCP和BULK INSERT之类的内容,但涉及到SQLBulkCopy,还提供了很多思考的内容(可能有点过多,但至少无论如何它都是有用的参考)。
花了7年,但我们终于有了答案...
详细解释Sam Anwar的答案,我可以确认它正在将数据转换为原始字节处理,并将其写入SQL,就像是从文件中流进来一样。 如何欺骗SQL使其认为读取文件超出了我的范围。
我想从查询内部进行批量插入,以加快慢速聚集索引的插入。在这里找到您的帖子后,我莫名其妙地被它吸引了,所以我花了过去几个小时来研究它。
实际将数据写入服务器的执行路径似乎是:
您的代码:
在System.Data.SqlClient.SqlBulkCopy内部:
-在System.Data.SqlClient.TdsParser内部:
-在System.Data.SqlClient.SNINativeMethodWrapper中:
现在是棘手的地方。我认为,但这是如何实现的。我在sni.dll副本上打开了文件属性,转到“详细信息”选项卡,在“产品版本”属性中,我找到了对d0d5c7b49271cadb6d97de26d8e623e98abdc8db的“提交哈希”的引用。
所以我googled that hash,并通过this Nuget search我找到了this Nuget package,其标题包括“ System.Data.SqlClient.sni”,这暗示了命名空间System.Data.SqlClient.SNI,找到here,但这没有正确的方法,并且实际上似乎未与服务器通信。
所以这是我用尽专业知识的地方;在深入到我在任何地方都找不到的本机代码之前,这是我所能获得的一切。尽管我不确定上面所有其他噪音是什么...
TLDR:最终看起来它只是执行INSERT BULK查询(不需要文件),并且实际上并没有使用BULK INSERT(确实)。注意,这两个命令看起来非常相似。
[Microsoft文档中的重要说明:
由外部工具用于上传二进制数据流。这个选项是不适用于SQL Server Management Studio等工具,SQLCMD,OSQL或数据访问应用程序编程接口,例如作为SQL Server本机客户端。
我将其解释为“使用后果自负,不希望得到帮助”。公平地说,这几乎和绿灯一样好。