Ошибка SQL: строка или двоичные данные будут усечены
Я делаю интеграцию на платформе сообщества под названием Telligent. Я использую стороннюю надстройку BlogML для импорта сообщений блога из файла XML (в формате BlogML) на мой локальный сайт Telligent. Платформа Telligent поставляется с множеством классов в их SDK, так что я могу программно добавлять контент, например сообщения в блоге. Например
myWeblogService.AddPost(myNewPostObject);
Приложение BlogML, которое я использую, по сути анализирует XML и создает объекты постов в блоге, а затем добавляет их на сайт с помощью кода, подобного приведенной выше строке примера. Примерно после 40 постов импорта я получаю ошибку SQL:
Exception Details: System.Data.SqlClient.SqlException:
String or binary data would be truncated.
The statement has been terminated.
Я считаю, что эта ошибка означает, что я пытаюсь вставить слишком много данных в поле БД, которое имеет ограничение максимального размера. К сожалению, я не могу сказать, для какой области это проблема. Я запустил SQL Server Profiler во время импорта, но не вижу, в какой хранимой процедуре происходит ошибка. Есть ли другой способ использовать профилировщик или другой инструмент, чтобы точно определить, какая хранимая процедура и даже в каком поле вызвана ошибка? Есть ли другие советы, чтобы получить больше информации о том, где конкретно искать?
О, радости сторонних инструментов...
2 ответа
Вы правы в том, что исключение связано с попыткой вставить слишком много данных в символьное / двоичное поле. Выполнение трассировки должно определенно позволить вам увидеть, какая процедура / оператор генерирует исключение, если вы фиксируете правильные события, то те, которые вы хотите захватить, будут включать:
- SQL: BatchStarting
- SQL: BatchCompleted
- SQL: StmtStarting
- SQL: StmtCompleted
- RPC: Starting
- RPC: Completed
- SP: Starting
- SP: Completed
- SP:StmtStarting
- SP: StmtCompleted
- исключение
Если вы точно знаете, что это хранимая процедура, содержащая ошибочный код, вы можете покончить с захватом # 1-4. Убедитесь, что вы захватили все связанные столбцы в трассировке (должно быть по умолчанию, если вы запускаете трассировку с помощью инструмента Profiler). Класс Exception будет включать в себя фактическую ошибку в вашей трассировке, что должно позволить вам увидеть непосредственно предшествующий оператор в том же SPID, который вызвал исключение. Вы должны включить начальные события в дополнение к завершенным событиям, так как возникающее исключение не позволит запускать связанные завершенные события в трассировке.
Если вы можете отфильтровать свою трассировку для конкретной базы данных, приложения, имени хоста и т. Д., Что, несомненно, облегчит отладку, если вы находитесь на занятом сервере, однако, если вы находитесь на незанятом сервере, вам может не понадобиться фильтрация.
Предполагая, что вы используете Sql 2005+, трассировка будет включать в себя столбец с именем "EventSequence", который в основном является инкрементным значением, упорядоченным по последовательности, инициируемой событиями. После того, как вы запустите трассировку и захватите вывод, найдите событие "Исключение", которое сработало (если вы используете профилировщик, строка будет красного цвета), то вы сможете просто найти самый последний SP:StmtStarting или SQL: событие StmtStarting для того же SPID, что произошло до исключения.
Вот снимок экрана с профилем, который я сделал и воспроизводящим событие, похожее на ваше:
http://i47.tinypic.com/1zc01mo.jpg
Вы можете видеть строку исключения красным цветом, а выделенная строка - это непосредственно предшествующее событие SP:StmtStarting, которое сработало до исключения для того же SPID. Если вы хотите узнать, к какой хранимой процедуре относится этот оператор, найдите значения в столбцах ObjectName и / или ObjectId.
Сделав несколько глупых ошибок, вы получите эту ошибку.
если вы пытаетесь вставить строку, как.
String reqName="Food Non veg /n";
здесь /n является виновником. Удалите /n из строки, чтобы выйти из этой ошибки.
Я надеюсь, что это поможет кому-то.