2013-06-19 2 views
0

Мой проект должен иметь дело с огромной базой данных. В худшем случае это может быть более 80 миллионов строк.Игнорировать строку ошибок при обновлении или вставке SQL Server

Теперь у меня есть 2 стола T1 и T2. Я должен скопировать данные из таблицы T1 в таблице T2

  • , если строка в таблице T1 уже существует в таблице T2 (такой же первичный ключ), а затем обновить данные других столбцов строки в T1 к T2
  • еще вставить новую строку в T2

в первый, я использую во время цикла перебрать 80 миллионов подряд в T1 затем обновить или вставить в T2. Это очень очень медленно, для завершения требуется более 10 часов. Но, если какая-либо строка вызывает ошибку, я могу игнорировать ее, а также поймать ошибку.

После этого я использовать запрос:

update Table2 
set T2.Column1 = T1.Column1,T2.Column2=T1.Column2 
from Table2 T2 JOIN Table1 T1 ON T1.ID=T2.ID 

Это намного быстрее, только занимает около 1-> 2 часов, чтобы закончить. Но, если какая-либо строка имеет ошибку, запрос не может выполняться вообще.

Итак, мой вопрос:

  • Есть ли способ, что выше запроса может игнорировать ряд ошибок и продолжить выполнение с действующей строкой?

  • Если я не могу это сделать, что я могу сделать, чтобы работать быстрее, чем первый метод, а также может ловить строку ошибок?

р/с: Я пытаюсь разбить таблицу на несколько небольших части затем обновить или вставить все малую часть в то же самое время, но он не быстрее всех.

Я решил проблему с моим вторым методом. Я использую TRY_CAST для предотвращения исключения при вставке или обновлении строки. Любые данные, которые недействительны, будут NULL. После окончания, я сравниваю 2 таблицы и нахожу разные строки. Эта строка является строкой ошибок.

ответ

0

Я решил проблему с моим вторым методом. Я использую TRY_CAST для предотвращения исключения при вставке или обновлении строки. Любые данные, которые недействительны, будут NULL. После окончания, я сравниваю 2 таблицы и нахожу разные строки. Эта строка является строкой ошибок.

0

Что касается функциональности, вы просите, я хотел бы предложить следующее:

MERGE INTO table2 target 
USING 
(
    SELECT id, column1, column2 FROM table1 
) source ([id], [column1], [column2]) 
ON target.[Id] = source.[Id] 
WHEN MATCHED THEN 
    UPDATE SET 
     target.Colum1 = source.Column1, 
       target.COlumn2 = source.Column2 
WHEN NOT MATCHED BY SOURCE THEN 
DELETE 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT ([Id], [Column1], [Column2]) 
    VALUES([Id], [Column1], [Column2]) 
; 

Что касается игнорирования ошибок - я вижу, так как неправильный. в этом отношении я бы потратил некоторое усилие на проверку данных.

+0

спасибо. Запуск полученной ошибки: Msg 4104, уровень 16, состояние 1, строка 7 Идентификатор из нескольких частей «SOURCE.ID» не может быть связан. – user2500561

+0

Можете ли вы проверить, работает ли ваше предложение выбора в «unsing». это может произойти, чем та же ошибка будет повторяться. Если это произойдет - вы должны искать проблему в своем SELECT –

+0

Спасибо. Я решил проблему с моим вторым методом. Я использую TRY_CAST для предотвращения исключения при вставке или обновлении строки. Любые данные, которые недействительны, будут NULL. После окончания, я сравниваю 2 таблицы и нахожу разные строки. Эта строка является строкой ошибок. – user2500561

0

Вы можете попробовать удалить существующие строки из T2, а затем Bulk Вставить все строки из T1. Это зависит от количества существующих строк, если оно слишком велико, тогда этот подход не будет работать.

Смежные вопросы