【问题标题】:SQL Server field getting truncatedSQL Server 字段被截断
【发布时间】:2012-06-14 18:53:56
【问题描述】:

好的,我使用的是 SQL Server 2008,并且有一个 VARCHAR(MAX) 类型的表字段。问题是当使用Hibernate 保存信息时,VARCHAR(MAX) 字段的内容被截断。我在应用服务器或数据库服务器上都没有看到任何错误消息。

该字段的内容只是一个纯文本文件。此文本文件大小为 383KB。

这是我迄今为止为解决此问题所做的工作:

  1. 将数据库字段从 VARCHAR(MAX) 更改为 TEXT 和相同 出现问题。

  2. 使用 SQL Server Profiler,我注意到全文 内容正在
    由数据库服务器接收,但由于某种原因,探查器在尝试时冻结 查看有截断问题的 SQL。就像我说的,就在它冻结之前,我
    确实注意到正在接收全文文件内容(383KB),所以看起来 可能是数据库问题。

以前有人遇到过这个问题吗?有什么想法会导致这种截断吗?

注意:只想提一下,我只是进入 SQL Studio,只是复制 TEXT 字段内容并将其粘贴到 Textpad。这就是我注意到它被截断的原因。

提前致谢。

【问题讨论】:

  • 一个与我的回答无关的建议:停止使用 Profiler。请改用服务器端跟踪。
  • @AaronBertrand 你能解释一下你为什么反对 Profiler 吗?
  • @Apostrofix 因为 Profiler 可以让您的服务器瘫痪。跟踪也可以,扩展事件也可以,但使用 Profiler 更容易。来自this article:SQL Server Profiler is a tool to be avoided on busy production servers, as shown by the tenfold increase in duration and significant reduction in throughput for the replay.
  • 我明白了,很好的解释,谢谢!

标签: database sql-server-2008 hibernate varcharmax


【解决方案1】:

您的问题是您认为 Management Studio 会为您提供所有数据。它没有。转到工具 > 选项 > 查询结果 > SQL Server。如果您使用结果到网格,请将“检索到的最大字符数”更改为“非 XML 数据”(请注意,结果到网格将消除任何 CR/LF)。如果您使用的是结果转文本,请更改“每列中显示的最大字符数”。

您可能想输入更多内容,但在 Management Studio 中最多可以返回:

65535 for Results to Grid
8192  for Results to Text

如果您真的想查看 Management Studio 中的所有数据,可以尝试将其转换为 XML,但这也有问题。首先将 Results To Grid > XML data 设置为 5 MB 或无限制,然后执行:

SELECT CONVERT(XML, column) FROM dbo.table WHERE...

现在这将产生一个网格结果,其中链接实际上是可点击的。这将打开一个新的编辑器窗口(它不是查询窗口,因此不会有执行按钮、IntelliSense 等),您的数据将转换为 XML。这意味着它将用> 等替换>。这是一个简单的例子:

SELECT CONVERT(XML, 'bob > sally');

结果:

当你点击网格时,你会看到这个新窗口:

(它确实有 IntelliSense,可以验证 XML 格式,这就是你看到波浪线的原因。)

回到牧场

如果您只是想进行完整性检查并且不想将所有 383K 复制到其他地方,那就不要!只需检查使用:

SELECT DATALENGTH(column) FROM dbo.table WHERE...

这应该表明您的数据已被数据库捕获,问题出在工具和您的验证方法上。

(我后来写了a tip about this here。)

【讨论】:

  • 是的,你是对的。我有网格的默认结果。是的,在我不得不编写一个虚拟程序从数据库中读取并将该字段写入文件之后,我意识到了这一点。非常感谢,第一次遇到这个问题。
  • SELECT CONVERT(XML, 'bob & sally') 以 XML parsing: line 1, character 6, illegal name character 失败。你可以使用SELECT 'bob & sally' FOR XML PATH(''),但这会给出bob & sally。我更喜欢SELECT 'bob & sally' AS [processing-instruction(x)] FOR XML PATH('') 以避免实体化。
  • @Martin 好点,当我以这种方式使用 XML 时,它通常是将更多基本字符串移动到顶部窗格的快捷方式。
  • 我唯一要补充的是,更改文本输出的限制需要重新启动 SSMS。
【解决方案2】:

尝试使用SELECT * FROM dbo.table for XML PATH

【讨论】:

    【解决方案3】:

    我也遇到过类似的情况。我有一张excel表格。工作表中的几列可能有超过 255 个字符,有时甚至是 500 个。一种简单的方法是对数据行进行排序,将具有最多字符的行放在顶部。你实际上只需要一排。当 SQL 导入数据时,它会识别超过 255 个字符的字段并导入整个数据:)

    否则,他们建议使用 regedit 更改特定值。不想那样做。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 2013-12-06
      • 2011-07-07
      相关资源
      最近更新 更多