T-SQL字符串相加之后被截断的那点事
2016-12-24 16:49
211 查看
本文出处:http://www.cnblogs.com/wy123/p/6217772.html
字符串自身相加, 虽然赋值给了varchar(max)类型的变量,在某些特殊情况下仍然会被“截断”,这到底是varchar(max)长度的问题还是操作的问题?
1,两个不超过8000长度的字符串自身相加,其结果长度超过8000之后会被截断:
不多说,直接上例子:定义一个字符串,赋值给 varchar(max)类型的变了,字符创长度为4040没有,任何问题。
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224160633057-1123387452.png)
把4040长度的字符串复制一份出来,也就是将两个4040长度的字符串“相加”
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224160851870-1515226295.png)
发现最后的结果是8000,为什么?肯定是被截断了,因为select @strSQL出来的字符串少了一部分。
varchar(max)定义的没问题,相加也没问题,那么为什么就被截断?
补充测试:此种情况下,用concat相加效果也一样(会被截断)
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224170043542-1168742982.png)
2,[b]两个字符串赋值给varchar(max)类型变量,用变量1+变量2的方式相加,其结果长度超过8000之后不会被截断:[/b]
上面问题先不回答,换一种操作方式看看结果
将连个字符串先分别赋值给两个varchar(max)的变量,将两个变量相加,赋值给一个varchar(max)的变量,看看最后变量相加的结果
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224161412870-330153294.png)
我想大概有答案了:
1,两个不超过8000长度的“字符串自身”相加,相加之后默认总长度是不超过8000的,超过8000的部分会被截断
2,将字符串赋值给varchar(max)变量之后,用“变量相加”的方式相加,赋值给一个varchar(max),其结果是不会被截断的
3,两个相加的字符串中有一个长度超过了8000,相加之后不会被截断:
另外还有一种情况,假如第一个字符串长度超过了8000,加一个任一长度的字符串(不管超不超过8000),最后的结果呢?
再次做一下论证,试一试就知道了。
此时第1个字符串长度超过了8000,第2个无所谓超不超过8000,那么相加之后,计算其LEN,最终的结果是没有被截断的。
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224162228620-2081851734.png)
补充测试:不截图了,此种情况下,用concat相加也没有问题(不会被截断)
4,[b]两个相加的字符串中有一个长度超过了8000,分别赋值给变量,相加之后不会被截断:[/b]
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224164742073-719378566.png)
最终的结论有三个
1,两个不超过8000长度的“字符串自身”相加,相加之后默认总长度是不超过8000的,如果相加之后的长度超过8000,超过8000的部分会被截断
2,相加的两个字符串中有一个长度超过了8000,相加两个字符串本身之后的结果是不会被截断的。
[b]3,[b]不管字符串长度如何,将字符串赋值给varchar(max)变量之后,用“变量相加”的方式相加,赋值给第三个varchar(max)变量,其结果是不会被截断的[/b][/b]
所以:当无法预计相加的两个字符串本身的长度是多少,以及相加之后的长度是多少的时候,
请不要直接对两个字符串本身进行相加(+)操作,为了确保万无一失,请将字符串赋值给varchar(max)变量之后,用变量相加,因为用变量相加的方式总是会没有问题的。
补充:以上测试是以非Unicode字符为例的
当字符串为Unicode字符型的时候(Unicode字符为两个字节,非Unicode字符为1个字节),8000这个数值也要除以2,也即4000
字符串自身相加, 虽然赋值给了varchar(max)类型的变量,在某些特殊情况下仍然会被“截断”,这到底是varchar(max)长度的问题还是操作的问题?
1,两个不超过8000长度的字符串自身相加,其结果长度超过8000之后会被截断:
不多说,直接上例子:定义一个字符串,赋值给 varchar(max)类型的变了,字符创长度为4040没有,任何问题。
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224160633057-1123387452.png)
把4040长度的字符串复制一份出来,也就是将两个4040长度的字符串“相加”
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224160851870-1515226295.png)
发现最后的结果是8000,为什么?肯定是被截断了,因为select @strSQL出来的字符串少了一部分。
varchar(max)定义的没问题,相加也没问题,那么为什么就被截断?
补充测试:此种情况下,用concat相加效果也一样(会被截断)
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224170043542-1168742982.png)
2,[b]两个字符串赋值给varchar(max)类型变量,用变量1+变量2的方式相加,其结果长度超过8000之后不会被截断:[/b]
上面问题先不回答,换一种操作方式看看结果
将连个字符串先分别赋值给两个varchar(max)的变量,将两个变量相加,赋值给一个varchar(max)的变量,看看最后变量相加的结果
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224161412870-330153294.png)
我想大概有答案了:
1,两个不超过8000长度的“字符串自身”相加,相加之后默认总长度是不超过8000的,超过8000的部分会被截断
2,将字符串赋值给varchar(max)变量之后,用“变量相加”的方式相加,赋值给一个varchar(max),其结果是不会被截断的
3,两个相加的字符串中有一个长度超过了8000,相加之后不会被截断:
另外还有一种情况,假如第一个字符串长度超过了8000,加一个任一长度的字符串(不管超不超过8000),最后的结果呢?
再次做一下论证,试一试就知道了。
此时第1个字符串长度超过了8000,第2个无所谓超不超过8000,那么相加之后,计算其LEN,最终的结果是没有被截断的。
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224162228620-2081851734.png)
补充测试:不截图了,此种情况下,用concat相加也没有问题(不会被截断)
4,[b]两个相加的字符串中有一个长度超过了8000,分别赋值给变量,相加之后不会被截断:[/b]
![](https://images2015.cnblogs.com/blog/380271/201612/380271-20161224164742073-719378566.png)
最终的结论有三个
1,两个不超过8000长度的“字符串自身”相加,相加之后默认总长度是不超过8000的,如果相加之后的长度超过8000,超过8000的部分会被截断
2,相加的两个字符串中有一个长度超过了8000,相加两个字符串本身之后的结果是不会被截断的。
[b]3,[b]不管字符串长度如何,将字符串赋值给varchar(max)变量之后,用“变量相加”的方式相加,赋值给第三个varchar(max)变量,其结果是不会被截断的[/b][/b]
所以:当无法预计相加的两个字符串本身的长度是多少,以及相加之后的长度是多少的时候,
请不要直接对两个字符串本身进行相加(+)操作,为了确保万无一失,请将字符串赋值给varchar(max)变量之后,用变量相加,因为用变量相加的方式总是会没有问题的。
补充:以上测试是以非Unicode字符为例的
当字符串为Unicode字符型的时候(Unicode字符为两个字节,非Unicode字符为1个字节),8000这个数值也要除以2,也即4000
相关文章推荐
- T-SQL字符串相加之后被截断的那点事
- 异常详细信息: System.Data.SqlClient.SqlException: 将截断字符串或二进制数据。
- 在access中执行SQL,SQL中包含IIF,取出来的结果集字符串被截断了,请教各位大侠,这个是为什么呀?谢谢!
- com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据
- 异常:com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。
- 异常详细信息: System.Data.SqlClient.SqlException: 将截断字符串或二进制数据。
- 问题集锦07:使用T-SQL导入数据时报错“将截断字符串或二进制数据”
- System.Data.SqlClient.SqlException: 将截断字符串或二进制数据
- com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据
- com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据
- SQL数据插入:将截断字符串或二进制数据
- 小心SQL中的字符串相加变成NULL
- 某列字符串相加计算的sql语句的写法
- 计算某列的字符串相加sql语句
- System.Data.SqlClient.SqlException: 将截断字符串或二进制数据。语句已终止
- com.microsoft.sqlserver.jdbc.SQLServerException 将截断字符串或二进制数据问题
- System.Data.SqlClient.SqlException: 将截断字符串或二进制数据。
- javax.servlet.ServletException: com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。
- 每日学习总结:DropDownList是否已选择验证、存储过程参数为sql字符串问题、将截断字符串或二进制数据。\r\n语句已终止
- SQL 字符串中去除出现汉字之后的字符