Я предлагаю использовать функцию XML в SQL Server 2005/2008, которая позволит вам выполнять массовые вставки и массовые обновления. Я бы выбрал следующий подход:
- Обработка всего файла в структуре данных в памяти.
- Создайте один XML-документ из этой структуры для передачи в сохраненный процесс.
- Создайте сохраненный процесс для загрузки данных из XML-документа во временную таблицу, затем выполните вставки и обновления. Ниже приведено руководство по созданию хранимой процедуры.
У этого подхода есть множество преимуществ:
- Вся операция завершается за один вызов базы данных, хотя, если ваш набор данных действительно большой, вы можете захотеть его пакетировать.
- Вы можете легко обернуть все записи базы данных в одну транзакцию и выполнить откат в случае сбоя.
- Вы не используете динамический SQL, который мог бы создать угрозу безопасности.
- Вы можете вернуть идентификаторы вставленных, обновленных и / или удаленных записей, используя предложение OUTPUT .
С точки зрения хранимого процесса вам понадобится что-то вроде следующего:
CREATE PROCEDURE MyBulkUpdater
(
@p_XmlData VARCHAR(MAX)
)
AS
DECLARE @hDoc INT
EXEC sp_xml_preparedocument @hDoc OUTPUT, @p_XmlData
-- Temporary table, should contain the same schema as the table you want to update
CREATE TABLE #MyTempTable
(
-- ...
)
INSERT INTO #MyTempTable
(
[Field1],
[Field2]
)
SELECT
XMLData.Field1,
XMLData.Field2
FROM OPENXML (@hdoc, 'ROOT/MyRealTable', 1)
WITH
(
[Field1] int,
[Field2] varchar(50),
[__ORDERBY] int
) AS XMLData
EXEC sp_xml_removedocument @hDoc
Теперь вы можете просто вставлять, обновлять и удалять вашу реальную таблицу из временной таблицы, как требуется, например,
INSERT INTO MyRealTable (Field1, Field2)
SELECT Field1, Field2
FROM #MyTempTable
WHERE ...
UPDATE MyRealTable
SET rt.Field2 = tt.Field2
FROM MyRealTable rt
JOIN MyTempTable tt ON tt.Field1 = MyRealTable.Field1
WHERE ...
Для примера XML, который вам нужно передать, вы можете сделать:
SELECT TOP 1 *, 0 AS __ORDERBY FROM MyRealTable AS MyRealTable FOR XML AUTO, ROOT('ROOT')
Для получения дополнительной информации см. OPENXML , sp_xml_preparedocument и sp_xml_removedocument .