SQL 2000 'TRY CATCH like' Обработка ошибок - PullRequest
5 голосов
/ 29 августа 2008

Это база данных SQL 2000, с которой я работаю.

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

Мне нужно привести / преобразовать все эти данные в соответствующие типы данных (например, int, decimal, nvarchar и т. Д.)

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

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

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

РЕДАКТИРОВАТЬ : Я использую пакет служб SSIS для заполнения промежуточной таблицы. Я вижу, что теперь я должен пересмотреть этот пакет и реализовать компонент сценария для обработки преобразований. Спасибо, ребята

РЕДАКТИРОВАТЬ : я я делаю это на основе записи за записью, а не пакетной вставкой, поэтому идея транзакции кажется осуществимой, но я не уверен, как перехватить @@ ERROR и разрешить продолжение хранимой процедуры.

РЕДАКТИРОВАТЬ : Мне действительно нравится Подход Гая , я собираюсь реализовать его таким образом.

Ответы [ 5 ]

2 голосов
/ 02 сентября 2008

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

Итак ...

В зависимости от того, сколько записей находится в вашей промежуточной таблице, вы можете выполнить последующую обработку данных с помощью ряда операторов 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 голосов
/ 29 августа 2008

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

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

IF @@Error <> 0
 GOTO LABEL

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

1 голос
/ 02 сентября 2008

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

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

ISNUM - to check if the data is of a numeric type
ISDATE - to check if it can be cast to DATETIME
1 голос
/ 29 августа 2008

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

1 голос
/ 29 августа 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...