Я знаю, что могу сделать объемную вставку в таблицу со столбцом идентификации, не указав SqlBulkCopyOptions.KeepIdentity
, как упомянуто here.Как получить сгенерированные сервера Значения идентичности при использовании SqlBulkCopy
Что я хотел бы сделать, это получить идентификационные значения, которые генерирует сервер, и поместить их в мой datatable или даже список. Я видел сообщение this, но я хочу, чтобы мой код был общим, и я не могу иметь столбец версии во всех моих таблицах. Любые предложения очень ценятся. Вот мой код:
public void BulkInsert(DataTable dataTable, string DestinationTbl, int batchSize)
{
// Get the DataTable
DataTable dtInsertRows = dataTable;
using (SqlBulkCopy sbc = new SqlBulkCopy(sConnectStr))
{
sbc.DestinationTableName = DestinationTbl;
// Number of records to be processed in one go
sbc.BatchSize = batchSize;
// Add your column mappings here
foreach (DataColumn dCol in dtInsertRows.Columns)
{
sbc.ColumnMappings.Add(dCol.ColumnName, dCol.ColumnName);
}
// Finally write to server
sbc.WriteToServer(dtInsertRows);
}
}
I сделав это, добавив еще один столбец в таблицу назначения, называемую «OriginalKey», а затем после того, как SqlBulkCopy завершил выбор OriginalKey, NewIdentityId и удалил столбец. Я считаю, что вы также можете использовать SqlBulkCopy для таблицы temp и INSERT с предложением OUTPUT, но теперь вы делаете два шага вместо одного. Или пропустите SqlBulkCopy и используйте TVP в инструкции INSERT ... OUTPUT. –
Рассматривали ли вы создание триггера INSERT в своей таблице и копирование значений идентификатора во временную таблицу, с которой может запрашивать ваш код C#? –
@ ta.speot.is Если у меня есть большая таблица (несколько миллионов записей), какой эффект добавит и опустит столбец на производительность? Будет ли это работать с одновременными процессами, вставляемыми в одну и ту же таблицу? – dseiple