【发布时间】:2011-09-12 19:49:40
【问题描述】:
我需要有效地将数以万计的数字和日期从 Ado.Net 提交到 SQl Server 2008。在 SQL 2008 之前的日子里,我将这些数字打包到一个图像中,这非常快。 Erland Sommarskog 非常友好地将我的一些代码包含在他的文章中Arrays and Lists in SQL Server 2005
因为现在我们可以使用 TVP,所以我尝试了它们。在客户端,我正在运行这个:
dataTable = new DataTable();
dataTable.Columns.Add("Date", typeof(DateTime));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(new object[] { someDate, somePrice });
command.CommandText = "Writers.SavePrices";
command.CommandType = CommandType.StoredProcedure;
var param = command.Parameters.AddWithValue("@Prices", dataTable);
param.SqlDbType = SqlDbType.Structured;
此代码有效,但我认为它效率不高。我启动了 Profiler,我立即看到 Ado.Net 发出以下非常低效的 SQL 发送到服务器:
DECLARE @Prices TABLE(...)
INSERT INTO @Prices(...)VALUES(...)
EXEC Writers.SavePrices @Prices=@Prices
因此,服务器上的大量网络带宽和 CPU 浪费在发送、解析和编译上。有没有更有效的方法在 Ado.Net 中使用 TVP?
【问题讨论】:
-
你知道SqlBulkCopy吗?它非常高效和灵活。 Here 就是一个例子。
-
@Tim:当然,我可以使用 SqlBulkCopy 将我的数据倒入临时表中。但是,我无法找到让 SqlBulkCopy 和 TVP 一起工作的方法。
-
@Tim:您可以将您的评论复制到答案中,以便我接受吗?显然没有更好的办法。
-
ADO.NET 是否如this blog post 中所述发送数以万计的
INSERT语句(TVP 中的每一行一个INSERT)?
标签: sql-server sql-server-2008 ado.net bulkinsert sqlbulkcopy