MS SQL - 截断误差
问题描述:
当我运行的更新/插入语句特定表我返回以下错误:MS SQL - 截断误差
* ERROR 8152 *(RC-1):SQLSTATE = 22001 Microsoft SQL Server本客户端10.0 字符串或二进制数据将被截断。
我已经通过手动我尝试更新,看看是否有比允许的列最大VARCHAR更大的值,并且每个使用下面的脚本无法找到任何表了:
select max(len(COLUMN_NAME)) from TABLE_NAME
有没有办法查询数据库的所有列中的值是否超出了列的最大允许字符数?
答
- 发生此错误是因为在插入/更新语句中存在超出目标列允许的最大字符数的值。然而,插入/更新将成功,问题是该值将被截断为允许的最大字符数。所以如果你定义了一个VARCHAR(100)并且你插入/更新了101个字符,那么最后一个字符会被留下。
- 如果由于SQL Server不存储和隐藏超出的字符或某些东西而导致值超出了列中允许的最大字符数,则无法通过查询或其他方式查看它只存储了多少个字符你告诉它存储。
- 如果列中的值处于未知范围内,则可以使用VARCHAR(MAX)。
+0
谢谢,先生。最终结果是触发器被设置为将值插入到审计表中的列中。该列不存在。 –
答
有没有一种方法来查询值DB的溢出允许的最大字符数为它的列的所有列?
正如其他评论指出,问题不在于目标表中的数据,而是您尝试插入/更新的数据。
但是,如果您插入/更新从不同表中选择的数据,这些查询可能对您有用。大多数情况下,他们写作很有趣。
更换#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#')
显示更新/插入查询。这实际上是必不可少的部分 –
您正在寻找错误的地方 - 您正在寻找太大的_existing_数据。你需要看看什么数据被添加到表中。查看'UPDATE' /'INSERT'语句和那里的值。 –
太大而无法放入列的数据将不在列中,因为它对于列来说太大您的UPDATE或INSERT语句将数据加载到表中,而且它所加载的数据包含数据那太大了。 [这也是从MS Sql服务器](https://connect.microsoft。com/SQLServer/feedback/details/339410 /),它只是告诉你一些太大的东西,甚至不会告诉你哪一列太大了。自2008年以来,他们一直想要解决它。 – JNevill