【问题标题】:String or binary data of '' would be truncated'' 的字符串或二进制数据将被截断
【发布时间】:2022-01-11 08:03:19
【问题描述】:

我正在尝试将一列的长度调整为 64 个字符:

ALTER TABLE [dbo].[consumption]
ALTER COLUMN [resourceGroup] VARCHAR(64) NOT NULL

但我收到以下错误:

字符串或二进制数据将在表“dbo.consumption”的列“resourceGroup”中被截断。截断值:''。

这对我来说没有意义:你怎么能截断任何内容?

任何帮助将不胜感激。

【问题讨论】:

  • @DaleK 我做到了,是的,我看到的数据超过 64 个字符。我的问题更多是关于为什么错误消息没有显示违反列的实际字符串以及为什么我得到一个空字符串,因为这具有误导性。
  • 看起来就像ALTER TABLE i.stack.imgur.com/nKsC1.png 的怪癖,它使用了扩展的错误消息但没有违规值
  • @DaleK 不,此列由不能包含空白字符的数据填充。
  • @MartinSmith 这是有道理的。它只是让我陷入了一个循环,因为我正在使用的数据源“保证”进入此列的数据不会超过 64 个字符,所以我假设 SQL 服务器正在做一些奇怪的事情,而不是假设数据来源提供的数据违反了自己的合同。
  • 带有值详细信息的扩展错误消息是最近才出现的,所以我假设他们没有在此代码路径中实现它(可能只知道一个任意值可能会失败在这种情况下不太可能有用)

标签: sql sql-server tsql


【解决方案1】:

感谢@MartinSmith 和@DaleK 的cmets,我想我已经找到了这个问题的答案。

我写给本专栏的数据源随附的文档指出,它的长度不应超过 64 个字符。然后,当我尝试更改列的长度时,错误消息让我相信 SQL Server 在空字符串上发出错误。根据@MartinSmith 的说法,这种类型的错误消息是最近的发展,因此对于ALTER TABLE 命令,可能尚未将违规值注入其中。此外,对该列的查询显示它确实包含超过 64 个字符的值。

因此,应按其含义理解此错误消息,并忽略截断值。

【讨论】:

  • "对于 ALTER TABLE 命令,有问题的值可能尚未注入其中。" - 不,这是一条旧错误消息。但是 SQL Server 的人假设管理员知道如何按长度排序,而你完全没有理由假设总是有一个字符串。如果 100.000 个字符串太长怎么办?显示一个是没用的。
  • @TomTom 我不认为只有一个字符串导致命令失败。我的假设是,由于错误消息中包含引号,因此这些引号中会有一些内容。如果错误消息没有包含引号,那么我根本不会对数据做出任何假设,但因为它们在那里,我自然倾向于使用这些信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多