Как эффективно вызывать возвращающие табличное значение параметры из Ado.Net

Мне нужно эффективно отправить десятки тысяч чисел и дат из 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?


person A-K    schedule 10.06.2011    source источник
comment
Знаете ли вы SqlBulkCopy? Это очень эффективно и гибко. Здесь является примером.   -  person Tim Schmelter    schedule 11.06.2011
comment
@Tim: конечно, я могу использовать SqlBulkCopy, чтобы вылить свои данные в промежуточную таблицу. Однако я не могу найти способ совместной работы SqlBulkCopy и TVP.   -  person A-K    schedule 11.06.2011
comment
Я упомянул это как альтернативу TVP. См. здесь и здесь для получения более интересной информации о SQLBulkCopy по сравнению с TVP.   -  person Tim Schmelter    schedule 11.06.2011
comment
@ Тим: можешь скопировать свой комментарий в ответ, чтобы я мог его принять? Видимо способа лучше нет.   -  person A-K    schedule 13.06.2011
comment
Отправляет ли ADO.NET десятки тысяч INSERT операторов (по одному INSERT для каждой строки в TVP), как описано в это сообщение в блоге?   -  person Nick Chammas    schedule 08.02.2012
comment
@NickChammas: это сообщение в блоге - именно то, что мне сообщает Profiler: по одному INSERT на строку.   -  person A-K    schedule 08.02.2012


Ответы (1)


Знаете ли вы SqlBulkCopy? Это очень эффективно и гибко. Здесь является примером.

Я упомянул это как альтернативу TVP. См. здесь и здесь для получения более интересной информации о SQLBulkCopy по сравнению с TVP.

(скопировано из комментариев)

person Tim Schmelter    schedule 13.06.2011