Как эффективно вызывать табличные параметры из Ado.Net - PullRequest
7 голосов
/ 11 июня 2011

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

1 Ответ

2 голосов
/ 13 июня 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...