sql拼接html字符串变量,sql语句大全之T-SQL字符串相加之后被截断的那点事

字符串自身相加, 虽然赋值给了varchar(max)类型的变量,在某些特殊情况下仍然会被“截断”,这到底是varchar(max)长度的问题还是操作的问题?

1,两个不超过8000长度的字符串自身相加,其结果长度超过8000之后会被截断:

不多说,直接上例子:定义一个字符串,赋值给 varchar(max)类型的变了,字符创长度为4040没有,任何问题。

df3dee6b4032ce0f3f0f0353376a24be.png

把4040长度的字符串复制一份出来,也就是将两个4040长度的字符串“相加”

3a4ac44cadd454262256de3d3e7e67d2.png

发现最后的结果是8000,为什么?肯定是被截断了,因为select @strSQL出来的字符串少了一部分。

varchar(max)定义的没问题,相加也没问题,那么为什么就被截断?

补充测试:此种情况下,用concat相加效果也一样(会被截断)

102ecb0fa886b29375265f52ec27e91b.png

2,两个字符串赋值给varchar(max)类型变量,用变量1+变量2的方式相加,其结果长度超过8000之后不会被截断:

上面问题先不回答,换一种操作方式看看结果

将连个字符串先分别赋值给两个varchar(max)的变量,将两个变量相加,赋值给一个varchar(max)的变量,看看最后变量相加的结果

2fd3f0b01f17d0f9c144cb4b4ca7626a.png

我想大概有答案了:

1,两个不超过8000长度的“字符串自身”相加,相加之后默认总长度是不超过8000的,超过8000的部分会被截断

2,将字符串赋值给varchar(max)变量之后,用“变量相加”的方式相加,赋值给一个varchar(max),其结果是不会被截断的

3,两个相加的字符串中有一个长度超过了8000,相加之后不会被截断:

另外还有一种情况,假如第一个字符串长度超过了8000,加一个任一长度的字符串(不管超不超过8000),最后的结果呢?

再次做一下论证,试一试就知道了。

此时第1个字符串长度超过了8000,第2个无所谓超不超过8000,那么相加之后,计算其LEN,最终的结果是没有被截断的。

467697cedbca2d1becfb1c2e9dc6538e.png

补充测试:不截图了,此种情况下,用concat相加也没有问题(不会被截断)

4,两个相加的字符串中有一个长度超过了8000,分别赋值给变量,相加之后不会被截断:

7d0f5e58b8d83891c97759741e67dcf4.png

最终的结论有三个

1,两个不超过8000长度的“字符串自身”相加,相加之后默认总长度是不超过8000的,如果相加之后的长度超过8000,超过8000的部分会被截断

2,相加的两个字符串中有一个长度超过了8000,相加两个字符串本身之后的结果是不会被截断的。

3,不管字符串长度如何,将字符串赋值给varchar(max)变量之后,用“变量相加”的方式相加,赋值给第三个varchar(max)变量,其结果是不会被截断的

所以:当无法预计相加的两个字符串本身的长度是多少,以及相加之后的长度是多少的时候,

请不要直接对两个字符串本身进行相加(+)操作,为了确保万无一失,请将字符串赋值给varchar(max)变量之后,用变量相加,因为用变量相加的方式总是会没有问题的。

补充:以上测试是以非Unicode字符为例的

当字符串为Unicode字符型的时候(Unicode字符为两个字节,非Unicode字符为1个字节),8000这个数值也要除以2,也即4000

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值