MS SQL - 截断错误

时间:2016-04-14 17:56:17

标签: sql sql-server

当我为特定表运行update / insert语句时,我返回以下错误:

* ERROR 8152 * (rc -1):SQLSTATE = 22001 Microsoft SQL Server Native Client 10.0 字符串或二进制数据将被截断。

我手动浏览了表格我试图更新以查看是否有任何值大于该列允许的最大varchar,并且无法使用以下脚本找到任何值:

select max(len(COLUMN_NAME)) from TABLE_NAME

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

2 个答案:

答案 0 :(得分:1)

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

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

但是,如果要插入/更新从其他表中选择的数据,这些查询可能对您有用。大多数情况下,写作都很有趣。

替换#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#')

答案 1 :(得分:0)

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