SQL错误:字符串或二进制数据将被截断

时间:2009-12-11 15:05:07

标签: sql-server exception stored-procedures telligent blogml

我正在一个名为Telligent的社区平台上进行集成。我正在使用名为BlogML的第三方插件将博客帖子从XML文件(以BlogML格式)导入我当地的Telligent网站。 Telligent平台的SDK中包含许多类,因此我可以通过编程方式添加内容,例如博客文章。 E.g。

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 Profiler,但我似乎无法看到发生错误的存储过程。是否有另一种方法可以使用分析器或其他工具来确切地查看哪些存储过程甚至是错误引起的字段?有没有其他提示可以获得有关具体外观的更多信息?

哦,第三方工具的乐趣......

2 个答案:

答案 0 :(得分:18)

你是正确的,因为异常是由于尝试将过多的数据填充到基于字符/二进制的字段中。运行跟踪绝对允许您在捕获正确事件时查看哪个过程/语句引发异常,您要捕获的事件包括:

  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. 异常
  12. 如果你确定它是一个包含错误代码的存储过程,你可以取消捕获#1-4。确保捕获跟踪中的所有关联列(如果使用Profiler工具运行跟踪,则应该是默认值)。 Exception类将包含跟踪中的实际错误,这应该允许您在抛出异常的同一SPID中查看前一个语句。除了已完成的事件之外,您还必须包含启动事件,因为发生的异常将阻止关联的已完成事件在跟踪中触发。

    如果您可以将跟踪过滤到特定数据库,应用程序,主机名等,如果您在繁忙的服务器上,这肯定会使调试变得更容易,但是如果您在空闲服务器上,则可能不需要打扰过滤。

    假设您使用的是Sql 2005+,则跟踪将包含一个名为“EventSequence”的列,该列基本上是由事件触发的序列排序的递增值。一旦你运行跟踪并捕获输出,找到触发的'异常'事件(如果你使用的是探查器,它的行将是红色),那么你应该能够简单地找到最新的SP:StmtStarting或SQL:异常之前发生的相同SPID的StmtStarting事件。

    以下是我拍摄的个人资料的屏幕截图,复制了与您类似的事件:

    alt text

    您可以在Red中看到异常行,突出显示的行是前一个SP:StmtStarting事件,该事件在同一SPID的异常之前触发。如果要查找此语句所属的存储过程,请在ObjectName和/或ObjectId列中查找值。

答案 1 :(得分:0)

通过做一些愚蠢的错误,你会收到这个错误。

如果您尝试插入类似的字符串。

String reqName="Food Non veg /n";

这里/ n是罪魁祸首。从字符串中移除/ n来摆脱这个错误。

我希望这会对某人有所帮助。