2008-08-28 2 views
5

Это база данных sql 2000, с которой я работаю.SQL 2000 «TRY CATCH like» Обработка ошибок

У меня есть то, что я называю промежуточной таблицей, которая является исходным дампом данных, поэтому все это ntext или nvarchar (255).

мне нужно бросить/преобразовать все эти данные в соответствующие типы данных (т.е. INT, десятичную, NVARCHAR и т.д.)

Как я собирался сделать это, чтобы перебрать все записи с помощью while и попытаться выполнить CAST для каждого столбца в одной записи во время каждой итерации после того, как я нахожусь в определенной записи, я отмечаю ее как обработанную (бит-поле).

Но как я могу зарегистрировать ошибку, когда/если она встречается, но разрешить цикл while продолжить.

Сначала я реализовал это с помощью TRY CATCH в локальном экземпляре SQL 2005 (чтобы получить проект), и все работает хорошо, но сегодня я узнал, что база данных разработчиков dev &, созданная международными DBA экземпляр SQL 2000, поэтому я должен соответствовать.

EDIT: Я использую пакет SSIS для заполнения промежуточной таблицы. Я вижу, что теперь я должен пересмотреть этот пакет и реализовать компонент скрипта для обработки конверсий. Спасибо, ребята

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

EDIT: Мне очень нравится Guy's approach, я собираюсь реализовать его таким образом.

ответ

2

Вообще мне не нравится «цикл по звукозаписывающих» решений, поскольку они, как правило, медленно, и вы в конечном итоге писать много пользовательского кода.

Итак ...

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

т.е.

UPDATE staging_table 
SET status_code = 'FAIL_TEST_1' 
WHERE status_code IS NULL 
AND ISDATE(ntext_column1) = 0; 

UPDATE staging_table 
SET status_code = 'FAIL_TEST_2' 
WHERE status_code IS NULL 
AND ISNUMERIC(ntext_column2) = 0; 

etc... 

Наконец

INSERT INTO results_table (mydate, myprice) 
SELECT ntext_column1 AS mydate, ntext_column2 AS myprice 
FROM staging_table 
WHERE status_code IS NULL; 

DELETE FROM staging_table 
WHERE status_code IS NULL; 

И промежуточная таблица имеет все ошибки, которые вы можете экспортировать и отчет из.

2

Что вы используете для импорта файла? У DTS есть возможности сценариев, которые могут использоваться для проверки данных. Если вы не используете DTS, вы используете собственный инструмент? Если так, сделайте свою проверку.

Но я думаю, что это то, что вы ищете.
http://www.sqlteam.com/article/using-dts-to-automate-a-data-import-process

IF @@Error <> 0 
GOTO LABEL 

@op
В SSIS «красная линия» от задачи импорта данных может перенаправить плохие строки в отдельный пункт назначения или преобразования. Я не играл с ним через некоторое время, но надеюсь, что это поможет.

1

Похоже, вы обречены. См. Документ this.

TL/DR: Ошибка преобразования данных всегда приводит к прерыванию всей партии - ваш SQL-скрипт не будет продолжать выполняться независимо от того, что вы делаете. Сделки не помогут. Вы не можете проверить @@ ERROR, потому что выполнение уже отменено.

Я бы сначала переосмыслил, почему вам нужна промежуточная база данных, полная столбцов varchar (255) - может ли какая-либо информация заполнять эту базу данных?

Если нет, я думаю, вам нужно будет написать программу/скрипт, чтобы выбрать из столбцов varchar, конвертировать и вставить в prod db.

1

Запуск каждого приведения в транзакцию после каждого приведения, отметьте @@ ERROR, если он очищен, зафиксирован и движется дальше.

1

Вы можете попробовать проверить тип данных перед литьем и фактически избежать ошибок бросания.

Вы можете использовать такие функции, как:

 
ISNUM - to check if the data is of a numeric type 
ISDATE - to check if it can be cast to DATETIME