我需要高效地从Ado.Net向SQL Server 2008提交数万个数字和日期。在SQL 2008之前,我将这些数字打包成图像,速度相当快。Erland Sommarskog很友好地在他的文章Arrays and Lists in SQL Server 2005中包含了我的一些代码。
由于现在我们可以使用TVPs,我尝试了它们。在客户端上,我运行以下代码:
作为结果,服务器上的大量网络带宽和CPU被浪费在发送、解析和编译上。是否有更有效的方法使用Ado.Net中的TVPs?
由于现在我们可以使用TVPs,我尝试了它们。在客户端上,我运行以下代码:
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中的TVPs?
INSERT
语句(每个TVP中的每一行都有一个INSERT
)? - Nick Chammas