【MSSQL】 SELECT INTO 字段长度问题

场景:

需要用select into 创建表,然后后续还有新的数据需要使用Insert into插入。结果多次测试,在insert into 的时候提示

消息 8152,级别 16,状态 14,第 7 行
将截断字符串或二进制数据。

最终发现select into 的时候字段数据短一点,然后到了insert into的时候,数据长了所以就超了,原理暂时没有特别清晰,但是是这个问题。文章尾部更新验证这个情况

 

下面开始还原场景:

 select '12' as fmnam into temp
 insert temp 
 select '986-57(胶箱出货)'
 DROP TABLE TEMP

 

 

第二次测试,使用N 

 select N'12' as fmnam into temp
 insert temp 
 select N'986-57(胶箱出货)'
 DROP TABLE TEMP

 

 

最后一次测试,想到是不是因为初始的长度可能就是固定了,那么在select into 的时候我给他cast一次,设置长度为nvarchar(max)

 select CAST('12' as varchar(max)) as fmnam into temp 
 insert temp 
 select '986-57(胶箱出货)'
 DROP TABLE TEMP

 

 

测试结果OK。那么可以猜测,是select into的时候为了性能,是直接吧第一行的长度作为了字段的长度,导致我后续insert into 的时候截断了。

 

第一次遇到这种情况,特意记录。

 

 

 

验证

先select into 创建表

 select N'12' as fmnam into temptemptemptemptemp

然后打开SSMS  找到表,右键设计

结果真的是你插入数据的长度就是这个字段的长度。

select CAST('12' as varchar(max)) as fmnam into temptemptemptemptemp 

 

转载于:https://www.cnblogs.com/jlz-s/p/10026020.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值