为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

婷婷同学_ 2019-10-09 17:54:29
我参与了一个数据迁移项目。当我尝试将数据从一个表插入到另一个表(SQL Server 2005)时,出现以下错误:消息8152,级别16,状态13,行1 字符串或二进制数据将被截断。源数据列与数据类型匹配,并且在目标表列的长度定义之内,因此我对可能导致此错误的原因一无所知。
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您将需要发布源表和目标表的表定义,以便我们找出问题所在,但最重要的是,源表中的一列大于目标列。可能是以您不知道的方式更改格式。您正在使用的数据库模型对于弄清这一点也很重要。


查看完整回答
反对 回复 2019-10-09
?
慕沐林林

TA贡献2016条经验 获得超9个赞

正如其他人已经说过的那样,源表中的列数据类型之一比目标列大。


一个简单的解决方案是简单地关闭警告并允许截断发生。因此,如果您收到此错误,但是您确定将旧数据库/表中的数据截断(按比例缩放)是可以接受的,则只需执行以下操作即可;


SET ANSI_WARNINGS  OFF;

-- Your insert TSQL here.

SET ANSI_WARNINGS ON;

如上所述,请始终记住随后再次打开警告。我希望这有帮助。


查看完整回答
反对 回复 2019-10-09
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

问题很简单:源查询中的一个或多个列包含的数据超出了其目标列的长度。一个简单的解决方案是采用源查询并Max(Len( source col ))在每一列上执行。即


Select Max(Len(TextCol1))

    , Max(Len(TextCol2))

    , Max(Len(TextCol3))

    , ...

From ...

然后将这些长度与目标表中的数据类型长度进行比较。至少超过其目标列的长度。


如果您绝对肯定不会出现这种情况,并且不介意不是这种情况,那么另一种解决方案是将源查询列强制转换为它们的目标长度(这将截断任何过长的数据):


Select Cast(TextCol1 As varchar(...))

    , Cast(TextCol2 As varchar(...))

    , Cast(TextCol3 As varchar(...))

    , ...

From ...


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 3213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信