У меня есть огромное INSERT
- оператор с 200 столбцами и suddendly я получаю страшное Error converting data type varchar to numeric
. Есть ли где-нибудь, я вижу фактический столбец, который содержит значение "varchar"? Я знаю, что могу удалить один из столбцов за один раз, пока ошибка не исчезает, но это очень утомительно.
Вы не указываете версию SQL Server или количество строк.
Для SQL2005 + добавление предложения OUTPUT
к INSERT может помочь идентифицировать несанкционированную строку, поскольку она будет выводить вставленные строки до тех пор, пока не обнаружит ошибку, поэтому следующая строка будет той, с которой возникла проблема
DECLARE @Source TABLE
(
Col1 VARCHAR(10),
Col2 VARCHAR(10)
)
INSERT INTO @Source
SELECT '1','1' UNION ALL
SELECT '2','2' UNION ALL
SELECT '3','3' UNION ALL
SELECT '4A','4' UNION ALL
SELECT '5','5'
DECLARE @Destination TABLE
(
Col1 INT,
Col2 VARCHAR(10)
)
INSERT INTO @Destination
OUTPUT inserted.*
SELECT *
FROM @Source
Возвращает
(5 row(s) affected) Col1 Col2 ----------- ---------- 1 1 2 2 3 3 Msg 245, Level 16, State 1, Line 23 Conversion failed when converting the varchar value '4A' to data type int.
К сожалению, эта ошибка вызывает серьезную боль, и ее нет. простой способ решить эту проблему. Когда я сталкивался с этим в прошлом, мне всегда приходилось комментировать группы столбцов, пока я не нашел виновника.
Другой подход может заключаться в использовании функции ISNUMERIC () в T-SQL, чтобы попытаться найти виновника. Предполагая, что каждый столбец в вашей целевой таблице является числовым (отрегулируйте соответствующим образом, если это не так), вы можете попробовать следующее:
SELECT *
FROM SourceTable
WHERE ISNUMERIC(Column1) = 0
OR ISNUMERIC(Column2) = 0
OR ISNUMERIC(Column3) = 0
OR ISNUMERIC(Column4) = 0
...
Это откроет строку, содержащую ваше нечисловое значение, и будет довольно ясно, в каком столбце оно находится. I знайте, что это утомительно, но, по крайней мере, это помогает вам выследить фактическое значение в дополнение к столбцу, который вызывает проблемы.
Ну, это всего лишь догадка, но как насчет вставки данных во временную таблицу и использования графического интерфейса для переноса данных в другую таблицу? Если он по-прежнему генерирует ошибку, вы, по крайней мере, сможете получить больше отзывов об этом нечисловом столбце ...
Если это не сработает, попробуйте это.
Ура!