Мне нужно эффективно отправить десятки тысяч чисел и дат из Ado.Net в SQl Server 2008. Раньше, до SQL 2008, я упаковывал эти числа в изображение, что было довольно быстро. Эрланд Соммарског любезно включил часть моего кода в свою статью Массивы и списки в 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
В результате большая часть пропускной способности сети и ЦП на сервере тратится на отправку, синтаксический анализ и компиляцию. Есть ли более эффективный способ использования TVP с Ado.Net?
INSERT
операторов (по одномуINSERT
для каждой строки в TVP), как описано в это сообщение в блоге? - person Nick Chammas   schedule 08.02.2012