我需要有效地提交从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?
答案 0 :(得分:2)
你知道SqlBulkCopy吗?它非常高效灵活。 Here就是一个例子。
我提到它作为TVP的替代品。有关与TVP相比的SQLBulkCopy的更多有趣信息,请参阅here和here。
(从评论中复制)