Код: Выделить всё
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();
}
}
Код: Выделить всё
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();
}
Как мне заполнить комментарии FIXME выше?
Связанный вопрос, нет хорошие ответы: Как мне создать временную таблицу в SQL Server, если у меня большой список идентификаторов
В комментариях есть просьба представить более широкую картину. На самом деле не существует хорошего способа получить больше информации, уменьшив масштаб. Существует ровно одна копия процедуры, которая устанавливает аргументы для всех вызовов SQL (читай: хранимых процедур) в базе кода, и это все.
Коэффициент масштабирования для количества строк имеет толстый хвост. ; среднее количество строк меньше 10, но максимальный размер очень велик, и вызовы с числом более тысячи происходят регулярно. Таким образом мы загружаем временную таблицу; и при преобразовании для выполнения чего-то другого, кроме цикла foreach, мы все равно загружаем временную таблицу.
Подробнее здесь: https://stackoverflow.com/questions/786 ... datarecord
Мобильная версия