Ошибка 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.

Я считаю, что эта ошибка означает, что я пытаюсь вставить слишком много данных в поле DB, который имеет максимальный размер. К сожалению, я не могу сказать, какой области это касается. Я запустил профилировщик SQL Server во время импорта, но я не вижу, в какой хранимой процедуре возникает ошибка. Есть ли другой способ использовать профилировщик или другой инструмент, чтобы увидеть, какая именно хранимая процедура и даже в каком поле возникает ошибка? Есть любые другие советы, чтобы получить больше информации о том, где конкретно искать?

о радости сторонних инструментов...

2 ответов


вы правы в том, что исключение связано с попыткой поместить слишком много данных в символьное/двоичное поле. Запуск трассировки должен определенно позволить вам увидеть, какая процедура / оператор создает исключение, если вы записываете правильные события, те, которые вы хотите захватить, будут включить:

  1. SQL: BatchStarting
  2. SQL: BatchCompleted
  3. SQL: StmtStarting
  4. SQL: StmtCompleted
  5. RPC:запуск
  6. RPC:завершено
  7. SP: запуск
  8. SP: завершено
  9. SP: StmtStarting
  10. SP: StmtCompleted
  11. исключение

Если вы точно знаете, что это хранимая процедура, которая включает неисправный код, вы можете покончить с захват #ы 1-4. Убедитесь, что вы также записываете все связанные столбцы в трассировке (должно быть по умолчанию, если вы используете трассировку с помощью инструмента профилировщика). Класс Exception будет включать фактическую ошибку в трассировке, которая должна позволить вам увидеть непосредственно предыдущий оператор в том же SPID, который вызвал исключение. Вы должны включить начиная с события в дополнение к завершенным событиям в качестве исключения, которое происходит, будут препятствовать связанному завершенному события от стрельбы на трассе.

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

предполагая, что вы используете Sql 2005+, трассировка будет включать столбец под названием "EventSequence", который в основном представляет собой увеличивающееся значение, упорядоченное последовательностью событий. Как только вы запустите трассировка и захват вывода, найти "исключение" событие, которое сработало (если вы используете profiler, строка будет в красном цвете), то вы должны быть в состоянии просто найти самый последний SP:StmtStarting или SQL:stmtstarting событие для того же SPID, который произошел до исключения.

вот снимок экрана профиля, который я захватил, воспроизводя событие, подобное вашему:

alt текст http://i47.tinypic.com/1zc01mo.jpg

вы можете увидеть строка исключения красным цветом и выделенная строка-это непосредственно предшествующее событие SP:StmtStarting, которое было запущено до исключения для того же SPID. Если вы хотите найти хранимую процедуру, частью которой является этот оператор, найдите значения в Столбцах ObjectName и/или ObjectId.


делая некоторые глупые ошибки вы получите эту ошибку.

Если вы пытаетесь вставить строку.

String reqName="Food Non veg /n";

здесь / n виновник.Удалите /n из строки, чтобы выйти из этой ошибки.

Я надеюсь, что это поможет кому-то.