【问题标题】:nvarchar max gives 'String or binary data would be truncated'nvarchar max 给出'字符串或二进制数据将被截断'
【发布时间】:2012-01-30 15:46:34
【问题描述】:

我正在尝试将大于 5500 个字符的字符串值插入 MSSQL 2008 数据库。我收到错误

字符串或二进制数据将被截断。

当我尝试插入这些值时,即使列的数据类型声明为 nvarchar(max)。我可以输入的字符串大小是否有上限?如果是这样,有什么办法可以解决这个问题?

编辑

当我通过 mgmt studio 手动输入数据时,它可以工作。但是,我正在通过 JDBC 驱动程序和准备好的语句执行更新。

我的查询格式为:

UPDATE table SET columnX = value1 WHERE columnX = value2;
  • 我将此语句添加到批处理中,每 1000 条语句执行一次。
  • 在这种情况下,value1 包含大量字符。
  • columnX 明确定义为 nvarchar(max)

【问题讨论】:

  • 你的代码和表 DDL 是什么样的?你试过最简单的测试用例吗?
  • 您确定这不是不同的列吗?此错误is infamous 提供的信息很少。
  • 发布您的查询、示例数据和表结构,我们可以提供帮助。基本上现在你说“我不能这样做”,我们没有信息可以继续,所以当前问题的答案是“不要那样做”,这同样没有帮助。
  • 另外,您使用的是哪个 JDBC 驱动程序和 JRE? MS-JDBC 实现在最近的 JRE 中存在一些已知的和可能仍然未知的问题
  • 不知道和你的问题有没有关系,但是MS官方不支持这种组合。见这里:blogs.msdn.com/b/jdbcteam/archive/2012/01/20/…

标签: java sql string sql-server-2008 nvarchar


【解决方案1】:

Microsoft 鼓励我们使用 SQLServerPreparedStatement 来修改像 varchar(max) 这样的大值类型。 http://msdn.microsoft.com/en-us/library/ms378813.aspx

您也可以使用存储过程来解决问题,当我在 JDBC/Pentaho 遇到类似问题时,我就是这样做的。

您可以在完成任务的 sql-server 上编写一个存储过程。只需从您的 Java 代码中调用该存储过程。

希望对你有帮助!

【讨论】:

  • 感谢 chris,我目前正在使用 java 的 PreparedStatement。这与 SQLServerPreparedStatement 有何不同?
  • 基本上有不同的JDBC-Stacks。一个来自微软。我真的不知道利弊。也许这部分回答了你的问题:msdn.microsoft.com/en-us/data/aa937724.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多