SQL Server: Узнайте то, что строка заставила TSQL приводить (SSIS) к сбою

Мы обычно присваиваем версию нашим проектам на основе текущей даты выпуска, YYYY.MM.DD.*, и мы позволяем номеру сборки генерировать автоматически, так например, если бы у нас был выпуск сегодня, то это было бы 26.09.2008. СБОРКА.

5
задан John Saunders 7 July 2009 в 20:24
поделиться

6 ответов

Что я делаю, так это разбиваю набор строк пополам с помощью предложения WHERE:

INSERT MyTable(id, datecol) SELECT id, datecol FROM OtherTable WHERE ID BETWEEN 0 AND 40,000

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

3
ответ дан 18 December 2019 в 14:49
поделиться

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

5
ответ дан 18 December 2019 в 14:49
поделиться

, если вы зацикливаете, добавьте отпечатки в цикл.

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

Операторы ADD CASE, чтобы выявить проблемы (преобразование этого неправильного значения в NULL или другое значение) и поместить значение в новый FlagColumn сообщая вам тип проблемы:

CASE WHEN ISNUMERIC(x)!=1 then NULL ELSE x END as x
,CASE WHEN ISNUMERIC(x)!=1 then 'not numeric' else NULL END AS FlagColumn

затем выберите новые преобразованные данные, где FlagColumn IS NOT NULL

, вы можете попробовать использовать операторы select с функциями isnumeric () или isdate () в различных столбцах исходных данных

РЕДАКТИРОВАТЬ

Есть много полей даты. В ТАБЛИЦЕ 2, есть значения данных, такие как «02/05/1075» для Даты рождения. я бы хотел изучите каждую строку, которая вызывает ошибка, поэтому я могу сообщить отдел, ответственный за плохое данные, чтобы они могли его исправить.

Используйте это, чтобы вернуть все строки с неверными датами:

SELECT * FROM YourTable WHERE ISDATE(YourDateColumn)!=1
1
ответ дан 18 December 2019 в 14:49
поделиться

Я предполагаю, что вы выполняете обновление с помощью INSERT INTO ...

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

2
ответ дан 18 December 2019 в 14:49
поделиться

У Джона Саудерса верная идея, есть более эффективные способы выполнения такого рода обработки с использованием SSIS. Однако изучение SSIS и переделка пакета для полного изменения процесса в настоящее время может оказаться невозможным, поэтому я предлагаю этот совет. Похоже, у вас проблемы с неправильными датами. Поэтому сначала запустите запрос, чтобы выявить плохие записи и вставить их в таблицу выполнения. Затем вы вставляете только те записи, которые остались. Примерно так:

 insert exceptiontable (field1, field2)
 select field1, field2 from table2 where isdate(field2) = 0

 insert table1 (field1, field2)
 select field1, field2 from table2 where isdate(field2) = 1

Затем, конечно, вы можете отправить содержимое таблицы исключений людям, которые предоставляют неверные данные.

0
ответ дан 18 December 2019 в 14:49
поделиться

Если вы работаете с курсорами, да, и это тривиально. Если вы не работаете с курсорами, я так не думаю, потому что операции SQL - это ACID или транзакции сами по себе.

0
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: