Мне нужно эффективно представить десятки тысяч номеров и дат от Ado.Net до SQl Server 2008. Еще в те дни, до SQL 2008, я собирал эти цифры в изображении, что было довольно быстро. Erland Sommarskog был достаточно любезен, чтобы включить некоторые из моего кода в свою статью « Массивы и списки в 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?
Вы знаете SqlBulkCopy ? Это очень эффективно и гибко. Вот пример.
Я упомянул об этом в качестве альтернативы TVP. Смотрите здесь и здесь более интересную информацию о SQLBulkCopy по сравнению с TVP.
(скопировано из комментариев)