Ну, вы можете сделать это, но вы должны задать правильный вопрос.
Вопрос: Могу ли я перехватить строку 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.
Обратите внимание, что мы можем добавить эту плохую запись в другую таблицу исправлений.И мы могли бы даже выполнить дополнительную обработку.
Итак, если мы будем использовать построчную обработку «курсора», мы не только перехватим одну строку, которая не может быть добавлена, но мы даже можем начать добавлять код, который будетвыплюните фактический столбец, который потерпел неудачу, и даже отправьте записи в какую-нибудь настольную программу, которая позволит людям редактировать + просматривать каждую запись, исправлять и нажимать кнопку, чтобы затем отправить запись в финальную таблицу.
С этим кодом запрос на добавление не останавливается на неправильной строке, но продолжает работать для всех записей.Вывод будет только показывать ошибочные строки, но действительные строки пройдут эту ловушку ошибок.