2016-10-27 5 views
1

Мне нужно получить значения IDENTITY из таблицы после SQLBULKCOPY в ту же таблицу. Объем данных может составлять тысячи записей.Как получить значения Identity в SQL BULK COPY?

Может кто-нибудь помочь мне в этом?

+0

просто получите IDENTITY так же, как если бы вы вставили 1 запись ... количество записей не имеет значения? – Seabizkit

+0

выберите их после того, как они вставлены, вам нужно будет добавить вставной идентификатор с расширением ... так что добавьте столбец batchId или что-то еще, а затем повторно выберите все записи с одним и тем же пакетом. – Seabizkit

+0

просто из интереса, сколько записей мы говорим. (Ball park) – Seabizkit

ответ

-2
-- 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 
+2

@ Ann88, который прямо скопирован из ответа Марка Гравелла, который я связал в своем ответе. Пожалуйста, обратите внимание на источник своего ответа, если вы собираетесь его скопировать. –

0

Я использовал решение, похожее на this one от Marc Gravell в том, что полезно сначала импортировать в временную таблицу.

Я также использовал MERGE и OUTPUT, как описано Jamie Thomson on this post отслеживать данные, которые я вставили в мою временную таблицу, чтобы сравнить его с идентификатором порожденного столбца IDENTITY таблицы, я хочу, чтобы вставить.

Это особенно полезно, когда вам нужно использовать этот идентификатор в качестве ссылки на внешний ключ для других таблиц, которые вы заполняете.

0

Попробуйте

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 
2

Отказ от ответственности: Я владелец проекта 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); 
Смежные вопросы