Импортируйте несколько строк во временную таблицу за один проход через SqlDataRecord.C#

Место общения программистов C#
Ответить
Anonymous
 Импортируйте несколько строк во временную таблицу за один проход через SqlDataRecord.

Сообщение Anonymous »

Эта проблема только начинает проявляться в профилировщике. У нас есть что-то похожее на это:

Код: Выделить всё

using (var cmd = connection.CreateCommand())
{
cmd.CommandText = "INSERT INTO #Ids VALUES (@0);";
cmd.Parameters.Add(cmd.CreateParameter() { ParameterName = "@0", DbType = GetDbType() });

cmd.Prepare();

foreach (var value in values)
{
((IDbDataParameter)cmd.Parameters[0]).Value = value;
cmd.ExecuteNonQuery();
}
}
Мы рассматриваем возможность ускорить этот процесс за счет уменьшения количества поездок туда и обратно. Использовать здесь DataTable было бы чудовищно, но есть тип SqlDataRecord, который кажется подходящим, поэтому мы сможем сделать что-то вроде этого:

Код: Выделить всё

using (var cmd = connection.CreateCommand())
{
cmd.CommandText = "INSERT INTO #Ids SELECT * FROM @0;";

var param  = cmd.CreateParameter();
param.ParameterName = "@0";
// FIXME more properties
cmd.Parameters.Add(param);
param.Value = values.Cast().Select((x) => {
// FIXME Create new SqlDataRecord
}.ToList();

cmd.ExecuteNonQuery();
}
Основная трудность, которая отличает этот образец от других примеров, — это буква T; этот код является динамическим и принимает огромное количество возможных типов; таким образом, CREATE TYPE не будет работать. Невозможно создать тип для любой возможной длины VARCHAR.
Как мне заполнить комментарии FIXME выше?
Связанный вопрос, нет хорошие ответы: Как мне создать временную таблицу в SQL Server, если у меня большой список идентификаторов
В комментариях есть просьба представить более широкую картину. На самом деле не существует хорошего способа получить больше информации, уменьшив масштаб. Существует ровно одна копия процедуры, которая устанавливает аргументы для всех вызовов SQL (читай: хранимых процедур) в базе кода, и это все.
Коэффициент масштабирования для количества строк имеет толстый хвост. ; среднее количество строк меньше 10, но максимальный размер очень велик, и вызовы с числом более тысячи происходят регулярно. Таким образом мы загружаем временную таблицу; и при преобразовании для выполнения чего-то другого, кроме цикла foreach, мы все равно загружаем временную таблицу.

Подробнее здесь: https://stackoverflow.com/questions/786 ... datarecord
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»