Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Pavel Popovciuc
Member

Откуда:
Сообщений: 6
Здравствуйте.
Я недавно начал усердно работать с SQL Server 2008 R2 и застрял на одном моменте ...

Суть такова:
1. У нас есть две таблицы Т1 и Т2.
2. Таблица Т1 - все поля типа varchar/nvarchar.
3. Таблица Т2 - у неё поля всевозможных типов данных.
4. В таблице Т1 могут находится повреждённые данные которые нельзя будет перенести.

Сама задача состоит в том чтоб перенести большой обём данных(сотни тысяч строк или более) из таблицы Т1 в таблицу Т2.
Если какуюто строку из Т1 нельзя перенести то её нужно обозначить как повреждённой. (поле RowStatus)

Само собой речь идёт о большом количестве данных(100к+), скорость это основной критерий.

Буду рад любым интерестным идеям.
8 июн 11, 00:16    [10779795]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
быстрее всего будет конечно bcp
Но пункт 4 - портит всю картину, у вас уже есть понимание что значит повержденные даные ?
Я б делал так
Готовил бы селект со всеми нудными конвертами и проверками ,отсек бы все что нельзя перенести и вывел бы все в файл- потому залали через bcp


Лдно тока не понятно - у вас сервера разные или один и тотже ? Да и понятие скорость - что значит ?
8 июн 11, 00:31    [10779852]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Pavel Popovciuc
Member

Откуда:
Сообщений: 6
Небольшое уточнение к пункту (4):
Под повреждёнными данными подрозумевается что значиение поля в Т1 не может быть преобразованно в нужный тип Т2.
Например 'qwe' в int.
8 июн 11, 00:32    [10779856]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Т1 - очень широкая ?
8 июн 11, 00:36    [10779869]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Pavel Popovciuc
Member

Откуда:
Сообщений: 6
Maxx
Т1 - очень широкая ?

Конкретных данных нету - но ожидается довольно широкая таблица.
8 июн 11, 00:40    [10779884]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
весело канечно... яб сначал тупо проверил бы селектами сколько данных "битых" - потом бы смотрел что мне дешевле, бо вариантов как ето сделать - таки много

Бо если реально не идут всего там 5 % записей в 10% полей - то ето запросто решаеться условием where с запросе на переливку данных и не надо говоридить лисапед,ьем более я так понимаю задача - одноразрвая
8 июн 11, 00:45    [10779895]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Pavel Popovciuc, вообще в такой постановке весьма трудно что-то сказать...
Ладно еще преобразование строки в число. А что если даты, да еще и в разных форматах?
ИМХО тут нужно на месте разбираться. Т.е. я вижу такой порядок действий:
1. Проапдейтить T1, пропустив по проверкам.
2. Перелить все, что проходит.
3. С остальным разбираться отдельно.

Еще вопрос: задача разовая или напостоянно?
* Сотни тысяч строк это не так уж и много. В то же время не ясно, какова максимальная задержка допустима?
8 июн 11, 00:51    [10779919]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Pavel Popovciuc
Member

Откуда:
Сообщений: 6
kDnZP
Еще вопрос: задача разовая или напостоянно?
* Сотни тысяч строк это не так уж и много. В то же время не ясно, какова максимальная задержка допустима?

Эта задача переодичная - увы.
8 июн 11, 01:02    [10779948]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Pavel Popovciuc,

тогда пахнет прилично написанным ETL процессом,если не одноразовая
И тогда вапрос - а откуда вам ето счастье приежает ?
8 июн 11, 01:03    [10779952]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Pavel Popovciuc, на счет проапдейтить... Наверное не стоит.
Т.е. скорее всего лучше будет 2 зеркальных скрипта - один выгребает то что нужно, другой - то чего не надо.
Универсальный рецепт тут врядли придумется. Надо на данные глядеть. Я когда в одной из задач импортирую корявые данные из Excel, то целый цикл проверок прогоняю, и то периодически доделывать приходится, потому как фантазия у пользователей может быть слишком изощренная.
8 июн 11, 01:08    [10779967]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Pavel Popovciuc
Member

Откуда:
Сообщений: 6
Ребят, вы случайно не знаите как можно сделать обработку ошибок при использовании BULK INSERT?

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

Так как это вижу я, это должно быть чтото типа SKIP_ERRORS.
8 июн 11, 16:02    [10784045]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Pavel Popovciuc, ну есть опция MAX_ERRORS, может этого вам хватит...
8 июн 11, 16:09    [10784102]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных между таблицами с типизацией и обработкой ошибок.  [new]
Pavel Popovciuc
Member

Откуда:
Сообщений: 6
kDnZP,
MERGE dbo.T_Target AS [Target]
USING dbo.T_Source AS [Source]
ON ([Target].RowId = Source.RowId)
WHEN MATCHED THEN
BEGIN
BEGIN TRY
UPDATE SET [Target].Data = [Source].Data
END TRY
BEGIN CATCH
UPDATE SET [Source].RowStatus = 'D'
END CATCH
END
WHEN NOT MATCHED BY TARGET THEN
BEGIN
BEGIN TRY
INSERT (RowId, Data)
VALUES ([Source].RowId, [Source].Data)
END TRY
BEGIN CATCH
UPDATE SET [Source].RowStatus = 'D'
END CATCH
END


Вот такое чудо решило бы все мои проблемы ..
Но тут не разрешается BEGIN и EXEC.
8 июн 11, 16:38    [10784404]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить