Я пытаюсь использовать SqlBulkCopy для копирования строк из одной таблицы SQL в другую.
Он хорошо работает до того момента, когда моя таблица назначения уже содержит кортеж с основным ключом, который я пытаюсь добавить.
Теперь все, что я ищу, это возможность пропустить кортеж, если он уже существует в таблице назначения.
Пожалуйста, может кто-нибудь намекнуть мне в правильном направлении?
Мой код выглядит так:
using(SqlConnection source = new SqlConnection(sourceConnectionstring))
{
source.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable");
SqlDataReader reader = cmd.ExecuteReader();
using(SqlBulkCopy bulkData = new SqlBulkCopy(destinationConnectionstring))
{
bulkData.DestinationTableName = "MyTable";
bulkData.WriteToServer(reader);
}
}
Я предполагаю, что один (ужасный) способ сделать это - создать DataTable, который содержит только кортежи, которые не существуют в таблице назначения ... Но разве нет возможности (или другого класса, возможно?), Который я могу использовать сохранить его просто и быстро?
Но разве нет возможности (или, возможно, другого класса?), Который я могу использовать, чтобы сохранить его простым и быстрым?
Нет, такой опции для SqlBulkCopy
Отказ от ответственности : Я являюсь владельцем проекта Bulk Operations
Эта библиотека не является бесплатной, но предлагает вариант InsertIfNotExists
вы ищете.
using(SqlConnection source = new SqlConnection(sourceConnectionstring))
{
source.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable");
SqlDataReader reader = cmd.ExecuteReader();
using(BulkOperation bulkData = new BulkOperation(destinationConnectionstring))
{
bulkData.DestinationTableName = "MyTable";
// INSERT only if row doesn't exist in the destination
bulkData.InsertIfNotExists = true;
bulkData.WriteToServer(reader);
}
}
Я не знаю ни одного варианта в классе SqlBulkCopy, чтобы пропустить дубликаты ключей. Вы можете попытаться установить параметр IGNORE_DUP_KEY в своем первичном ключе в таблице назначения. Это потребует, чтобы вам пришлось отказаться от ограничения основного ключа и воссоздать его следующим образом:
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND name = N'YourPrimaryKey')
ALTER TABLE [dbo].[YourTable] DROP CONSTRAINT [YourPrimaryKey]
GO
/****** Object: Index [PK_PKallowDup] Script Date: 05/22/2012 10:23:13 ******/
ALTER TABLE [dbo].[YourTable] ADD CONSTRAINT [YourPrimaryKey] PRIMARY KEY CLUSTERED
(
[YourPrimaryKeyColumn] ASC
)WITH (IGNORE_DUP_KEY = ON, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]