【问题标题】:String or binary data would be truncated. -- even though length shorter than field length字符串或二进制数据将被截断。 -- 即使长度比字段长度短
【发布时间】:2014-07-03 18:21:50
【问题描述】:

尝试使用 UPDATE 命令为表中的字符串字段添加前缀。出于某种原因,我得到了

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

例外,即使我的数据长度很容易适合该字段。

使用 SQL Server 2008 R2 标准版和 SSMS 2008 R2。

模板:Learner is a nvarchar(60)

模板:Learner 是一个 nvarchar(30),使用 60 个字节,如 sp_help 中所示

select LEN('Aaaaaaaa' + LEFT(learner, 52)) myLen from Template order by myLen desc
>>> max len = 31

update Template set learner = 'Aaaaaaaa' + LEFT(learner, 52)
>>> String or binary data would be truncated.

update Template set learner = 'Aaaaaaaa' + LEFT(learner, 52)
>>> String or binary data would be truncated.

update Template set learner = CAST('Aaaaaaaa' + LEFT(learner, 52) AS NVARCHAR(60))
>>> String or binary data would be truncated.

而以下工作:

SELECT CAST('Aaaaaaaa' + LEFT(learner, 52) AS NVARCHAR(60)) FROM Template

【问题讨论】:

  • 桌子上有触发器吗?
  • 不,但这是一个很好的提示。谢谢。

标签: sql sql-server tsql


【解决方案1】:

您可以尝试忽略此消息

SET ANSI_WARNINGS OFF
update ...
SET ANSI_WARNINGS ON

【讨论】:

  • 忽略一条消息而不了解它为什么会发生总是一个非常糟糕的主意。
  • 你说得对,但有时你只需要继续忽略小警告。
  • 我同意,但这表示数据丢失,因此不是“轻微”。再说一遍:首先了解 - 然后决定。
  • 永远不要说总是。感谢您的提示。
【解决方案2】:

感谢您的回复。

看起来我被 sp_helpsp_columns 上的长度值欺骗了。由于它是 NVARCHAR 列,因此长度是指以字节为单位的长度,而不是字符数。这是因为 NVARCHAR = Unicode (UTF-16) => 每个字符 2 个字节。

查看 CREATE 脚本揭示了真相。 sp_columns 上的 PRECISION 字段也显示字符数。

【讨论】:

    【解决方案3】:

    我的问题是有另一个日志表(用于审计跟踪),由主表上的触发器填充,其中列大小也必须更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2010-10-21
      • 2022-01-11
      相关资源
      最近更新 更多