【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 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM