У меня есть хранимая процедура, которая вставляет 650 полей в таблицу. Вставка не выполняется с ошибкой усечения.
Это просто
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
Ниже приведено сообщение об ошибке:
Сообщение 8152, уровень 16, состояние 14, процедура DSP_Procedure, строка 1075 Строка или двоичные данные будут обрезаны.
Есть ли быстрый способ определить, какое поле вызывает ошибку усечения?
Тот факт, что оператор выбора для вставки в таблицу имеет 650 полей, затрудняет точное определение того, какое поле вызывает ошибку усечения.
Я думаю, что я могу, возможно, закомментировать блоки полей за один раз, чтобы SP вставлял только 100 полей за раз, а затем запускал SP 6 или 7 раз, пока я, по крайней мере, не смог сузить группу из 100 полей. это будет содержать поле, которое вызывает ошибку усечения.
В качестве альтернативы я думаю, что, возможно, я могу просто SELECT INTO
создать новую таблицу, а затем сравнить длины данных в таблице с длинами данных целевой таблицы, в которую я пытаюсь вставить свой SP, чтобы увидеть, какое поле содержит длину, превышающую ожидаемую. ..
Я использую SQL Server 2014.
Есть ли более простые альтернативы?
источник
Ответы:
Если вы используете SQL Server 2016 (SP2, CU6 или новее), одним из вариантов является включение флага трассировки 460, например
(QUERYTRACEON 460)
. Вывод будет указывать столбец и ошибочные данные.Смотрите эту статью для деталей. https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/
Если вас не волнует усечение, вы можете
SET ANSI_WARNINGS OFF
игнорировать этот тип усечения.источник
К сожалению, вы столкнулись с довольно старой «фичей». С 2008 года был открыт билет Connect, и в течение почти десяти лет это не было достаточно значительным, чтобы гарантировать исправление.
Как вы и предполагали, стандартный обходной путь - это
select into...
сравнение метаданных таблицы. Другая возможность - бинарный поиск в ошибочном столбце, но это тоже ручная работа. Есть несколько хаков для сравнения метаданных, но простого, элегантного решения не существует. Может быть, некоторые сторонние инструменты будут полезны, но я не знаю об этом.источник
Использование (QUERYTRACEON 460) не сработало, когда я поставил его в конце моего запроса.
Я включил его на уровне БД, и это сработало:
Но не забудьте оставить его включенным после того, как вы нашли и устранили проблему.
источник