Игнорируйте плохие записи и обновляйте все хорошие в хранимой процедуре. Зарегистрируйте ошибки - PullRequest
0 голосов
/ 23 апреля 2020

Мне нужно переделать кучу сложных хранимых процедур в SQL Сервер, чтобы они игнорировали все записи, которые могли вызвать ошибки во время выполнения, и все еще вставляли / обновляли правильные записи. Я также должен отслеживать все сообщения об ошибках в отдельной таблице журнала. В настоящее время каждая процедура «обернута» внутри транзакции и имеется блок TRY..CATCH, поэтому в случае любой ошибки транзакция откатывается. Я хотел бы знать, как я могу изменить это поведение, но поддерживать эффективность как можно выше.

Я поцарапал и пример, чтобы было проще проверить.

--temporary table created for testing purposes
IF OBJECT_ID('tempdb..#temptable') IS NOT NULL
    DROP TABLE #temptable

CREATE TABLE #temptable  
(
    [name] varchar(50), 
    [divisible] int,
    [divider] int,
    [result] float
)
GO

--insert some dummy records in #temptable
-- example of a record with good data
INSERT INTO #temptable ([name], [divisible], [divider]) VALUES ('A', 1, 1)
-- example of a record with bad data
INSERT INTO #temptable ([name], [divisible], [divider]) VALUES ('B', 2, 0)
-- another example of a record with good data
INSERT INTO #temptable ([name], [divisible], [divider]) VALUES ('C', 3, 1)

--A dummy example for unhandled error (I know how to handle it otherwise ;-) )
UPDATE #temptable
SET [result] = divisible/divider

SELECT * FROM #temptable

В настоящее время ничего не обновляется:

Result 1

Я хотел бы обновить хорошие записи (A и C) и записать сообщение об ошибке, которое выбросит запись B.

Кроме того, имейте в виду, что у меня есть свобода представить SSIS в решении, но я не хочу переписывать все процедуры.

Так что бы вы предложили - курсор, в то время как l oop, SSIS или что-нибудь еще?

1 Ответ

0 голосов
/ 23 апреля 2020

Вам необходим многоуровневый подход для построения решения с учетом ситуации:

Слой 1, который запускается первым -

  • Проведите комплексную проверку допустимого диапазона данных и недопустимых выбросов. например. -ve числа, точность, макс. - + числа.
  • Сделайте некоторую работу по написанию кода для этапа проверки, когда вы идентифицируете такие записи в своей таблице процессов и перемещаете их (ie. В один раздел "begin tran ... commit tran", вставьте - удалите их из таблицы обработки, перейти к таблице журнала).

Второй уровень запускается вторым -

  • Продолжите выполнять оператор Update.

Хотя это предложение не относится к вашему вопросу, я рекомендую использовать цифру c или десятичную вместо типа данных с плавающей запятой. Вы можете столкнуться с проблемами с float.

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