Мне нужно получить значения IDENTITY из таблицы после SQLBULKCOPY в ту же таблицу. Объем данных может составлять тысячи записей.Как получить значения Identity в SQL BULK COPY?
Может кто-нибудь помочь мне в этом?
Мне нужно получить значения IDENTITY из таблицы после SQLBULKCOPY в ту же таблицу. Объем данных может составлять тысячи записей.Как получить значения Identity в SQL BULK COPY?
Может кто-нибудь помочь мне в этом?
-- dummy schema
CREATE TABLE TMP (data varchar(max))
CREATE TABLE [Table1] (id int not null identity(1,1), data varchar(max))
CREATE TABLE [Table2] (id int not null identity(1,1), id1 int not null, data varchar(max))
-- imagine this is the SqlBulkCopy
INSERT TMP VALUES('abc')
INSERT TMP VALUES('def')
INSERT TMP VALUES('ghi')
-- now push into the real tables
INSERT [Table1]
OUTPUT INSERTED.id, INSERTED.data INTO [Table2](id1,data)
SELECT data FROM TMP
@ Ann88, который прямо скопирован из ответа Марка Гравелла, который я связал в своем ответе. Пожалуйста, обратите внимание на источник своего ответа, если вы собираетесь его скопировать. –
Я использовал решение, похожее на this one от Marc Gravell в том, что полезно сначала импортировать в временную таблицу.
Я также использовал MERGE
и OUTPUT
, как описано Jamie Thomson on this post отслеживать данные, которые я вставили в мою временную таблицу, чтобы сравнить его с идентификатором порожденного столбца IDENTITY таблицы, я хочу, чтобы вставить.
Это особенно полезно, когда вам нужно использовать этот идентификатор в качестве ссылки на внешний ключ для других таблиц, которые вы заполняете.
Попробуйте
CREATE TABLE #temp
(
DataRow varchar(max)
)
BULK INSERT #Temp FROM 'C:\tt.txt'
ALTER TABLE #temp
ADD id INT IDENTITY(1,1) NOT NULL
SELECT * FROM #temp
Отказ от ответственности: Я владелец проекта Bulk Operations
Короче говоря, этот проект преодолевает SqlBulkCopy ограничения путем добавления должн- функции, такие как вывод, вставленный значение идентификатора.
Под капотом он использует SqlBulkCopy и аналогичный метод, как @Mr Moose.
var bulk = new BulkOperation(connection)
// Output Identity Value
bulk.ColumnMappings.Add("CustomerID", ColumnMappingDirectionType.Output);
// Map Column
bulk.ColumnMappings.Add("Code");
bulk.ColumnMappings.Add("Name");
bulk.ColumnMappings.Add("Email");
bulk.BulkInsert(dt);
просто получите IDENTITY так же, как если бы вы вставили 1 запись ... количество записей не имеет значения? – Seabizkit
выберите их после того, как они вставлены, вам нужно будет добавить вставной идентификатор с расширением ... так что добавьте столбец batchId или что-то еще, а затем повторно выберите все записи с одним и тем же пакетом. – Seabizkit
просто из интереса, сколько записей мы говорим. (Ball park) – Seabizkit