【问题标题】:MS SQL - Truncation ErrorMS SQL - 截断错误
【发布时间】:2016-08-06 10:43:18
【问题描述】:

当我为特定表运行更新/插入语句时,我返回以下错误:

* 错误 8152 *(rc -1) : SQLSTATE = 22001 Microsoft SQL Server 本地客户端 10.0 字符串或二进制数据将被截断。

我已经手动浏览了我正在尝试更新的表,以查看是否有任何值大于该列允许的最大 varchar,并且使用以下脚本找不到任何内容:

select max(len(COLUMN_NAME)) from TABLE_NAME

有没有办法在数据库中查询超出其列的最大允许字符数的所有列中的值?

【问题讨论】:

  • 显示更新/插入查询。这实际上是必不可少的部分
  • 您找错地方了 - 您正在寻找太大的现有数据。您需要查看的是哪些数据被添加到表中。查看UPDATE/INSERT 语句和那里的值。
  • 数据太大而无法放入列中,因为它对于列来说太大,所以不会在列中您的 UPDATE 或 INSERT 语句正在将数据加载到表中,并且是该数据它正在加载包含太大的数据。 Also this is a very well known PIA error from MS Sql Server 它只是告诉你某些东西太大了,甚至不会告诉你它对于哪一列来说太大了。自 2008 年以来,他们一直想解决这个问题。
  • 现有数据不能太大,已经插入成功。

标签: sql sql-server


【解决方案1】:

有没有办法在数据库中查询所有列中超出其列的最大允许字符数的值?

正如其他 cmets 指出的那样,问题不在于目标表中的数据,而在于您尝试插入/更新的数据。

然而,如果您要插入/更新从不同表中选择的数据,这些查询可能对您有用。大多数情况下,它们只是写起来很有趣。

替换 #MAX_LENGTH# 占位符和两个 #TABLE_NAME# 占位符,这将为您提供表格中的任何违规值

declare @dyn varchar(max)
select @dyn = 'select null as [Column], null as [Value], null as [Lenght] '
select @dyn = @dyn 
+ 'union select ''' + name + ''', cast(' + name + ' as varchar(max)), len(' + name + ')
   from #TABLE_NAME#
   where len(' + name + ') > #MAX_LENGTH#'
from sys.columns c
where c.object_id = object_id('#TABLE_NAME#')
exec(@dyn)

替换两个#TABLE_NAME# 占位符,这将显示表格每列中值的最大长度

declare @dyn varchar(max)
set @dyn = 'select 0 x'
select @dyn  = @dyn + ', max(len(' + name + ')) as [' + name + ']'
from sys.columns c
where c.object_id = object_id('#TABLE_NAME#')
exec(@dyn  + 'from #TABLE_NAME#')

【讨论】:

    【解决方案2】:
    1. 出现此错误是因为在插入/更新语句中存在超过目标列允许的最大字符数的值。但是,插入/更新将成功,问题是该值将被截断为最大允许字符。因此,如果您定义一个 VARCHAR(100) 并插入/更新 101 个字符,那么最后一个字符将被留下。
    2. 您无法通过查询或其他方式查看是否存在超过列中允许的最大字符数的值,因为 SQL Server 不会存储和隐藏超出的字符或其他内容。它只存储多少个字符你告诉它存储。
    3. 如果列的值在未知范围内,则可以使用 VARCHAR(MAX)。

    【讨论】:

    • 谢谢您,先生。最终,触发器被设置为将值插入审计表的列中。该列不存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    相关资源
    最近更新 更多