Добавить информацию о значении PK в выходное сообщение - проще найти ошибочную запись - PullRequest
0 голосов
/ 06 февраля 2019

Я помощник менеджера данных, и мы обрабатываем тысячи записей данных каждый день. Я постоянно ослепаю, пытаясь найти одно поле, которое содержит, например, ошибку преобразования даты, и я ищу и ищу.Иногда это очевидно и легко исправить, но часто это не так.

У нас есть одна таблица «оригинал», куда вводятся необработанные данные.Затем мы используем сохраненные фрагменты кода для обработки и запроса данных, перемещая их либо в «проверку», либо в «сохранение».Если есть ошибки, данные перемещаются в «проверить», а если ошибок нет, то эти записи данных перемещаются в «сохраненные».

Когда данные перемещаются и данные, которые не соответствуют логическим утверждениям, которые мы кодируем, те генерируют журналы ошибок за сбойЯ пытаюсь сделать это партиями по 10, чтобы сохранить количество записей на низком уровне, но в каждой записи можно проверить до 100 полей.Это 1000 отдельных полей для проверки ошибок даты и времени или реальных десятичных ошибок, наиболее распространенный тип ошибок.

Сообщение 241, Уровень 16, Состояние 1, Строка 3
Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

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

Я продолжаю ослепать во время проверки ошибок и исправления данных .. как мне улучшить сообщение об ошибке выше?Мне бы очень хотелось, чтобы вышеприведенное сообщение об ошибке можно было вывести и сказать PK = 000100 .. так:

Сообщение 241, Уровень 16, Состояние 1, Строка 3
Преобразование не выполнено при преобразовании даты и/ или время из символьной строки.
PK = 000100

Есть ли способ сделать это?

Я использую программу Microsoft SQL Server Management Studio v17.2 имы работаем с SQL Server 2016.

Спасибо.

1 Ответ

0 голосов
/ 15 февраля 2019

Ну, вы можете сделать это, но вы должны задать правильный вопрос.

Вопрос: Могу ли я перехватить строку PK, когда SQL-сервер выплевываетошибка?

Ответ: Да, но только для одного запроса на добавление и если это была одна строка.

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

Предполагается, что у меня есть это добавление:

INSERT INTO TimeTest
     (CustomerNames, StartTime, EndTime, StartTimeT, EndTimeT, StartTimeD)
SELECT
     CustomerNames, StartTime, EndTime, StartTimeT, EndTimeT, StartTimeD
FROM  MySource

В приведенной выше таблице назначения (TimeTest) указана строго указанная дата +столбцы времени.

В исходной таблице (MySource) каждый столбец представлен в виде столбца типа текста (некоторого типа символа).Эти данные были результатом импорта.Таким образом, могут быть и будут столбцы данных, которые являются неверными и неправильными столбцами даты.

Итак, при выполнении вышеизложенного я получаю следующее:

Msg 242, Level 16, State 3, Line 2
The conversion of a nvarchar data type to a datetime data type 
resulted in an out-of-range value.
The statement has been terminated.

Теперь, конечно, я хочуПК выше.Итак, я предлагаю использовать курсор.С помощью курсора я могу взять PK перед добавлением одной строки.

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

Я бы также предложил вам создать какой-нибудь интерфейс (скажем, в Access или vb.net и т. Д.), Который затем может отображать + обрабатывать эти плохие записи.Эта пользовательская система также должна иметь возможность запоминать исправления и изменения.И редактирование + сохранение отправило бы эту фиксированную строку прямо в таблицу сервера (эту таблицу окончательного покоя).

В любом случае, здесь есть хранимая процедура, которая будет делать это:

Create PROCEDURE MyInsertTrap
AS
BEGIN

DECLARE @PKID int
DECLARE @MyCol as nvarchar(50)
DECLARE @MyErr as nvarchar(200)

set nocount on

DECLARE db_cursor CURSOR FOR
SELECT        id 
FROM          MySource

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @pkid 
WHILE @@FETCH_STATUS = 0
    BEGIN   

       BEGIN TRY
       INSERT INTO TimeTest
              (CustomerNames, StartTime, EndTime, StartTimeT, EndTimeT, StartTimeD)
        SELECT
              CustomerNames, StartTime, EndTime, StartTimeT, EndTimeT, StartTimeD
        FROM MySource where MySource.id = @pkid;

       END TRY
       BEGIN CATCH
          -- Error in append, show pk, + error
          PRINT 'ERROR IN APPEND FOR PK = ' + cast( @pkid as nvarchar(10))
          PRINT ERROR_MESSAGE()

       END CATCH

       FETCH NEXT FROM db_cursor INTO @pkid 
    END
    CLOSE db_cursor
    DEALLOCATE db_cursor
END

outputсверху:

 ERROR IN APPEND FOR PK = 14522
 The conversion of a nvarchar data type to a datetime data type 
 resulted in an out-of-range value.

Обратите внимание, что мы можем добавить эту плохую запись в другую таблицу исправлений.И мы могли бы даже выполнить дополнительную обработку.

Итак, если мы будем использовать построчную обработку «курсора», мы не только перехватим одну строку, которая не может быть добавлена, но мы даже можем начать добавлять код, который будетвыплюните фактический столбец, который потерпел неудачу, и даже отправьте записи в какую-нибудь настольную программу, которая позволит людям редактировать + просматривать каждую запись, исправлять и нажимать кнопку, чтобы затем отправить запись в финальную таблицу.

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

...