本文出处:http://www.cnblogs.com/wy123/p/6217772.html

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

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

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

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

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

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

  

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

  

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

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

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

  

  我想大概有答案了:

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

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

 

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

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

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

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

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

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

  

最终的结论有三个

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

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

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

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

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

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

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

T-SQL字符串相加之后被截断的那点事的更多相关文章

  1. sql经常会遇到“将截断二进制或字符串”的错误——处理办法

    sql经常会遇到“将截断二进制或字符串”的错误——处理办法 1.修改列长度——无法定位具体字段 2.程序逻辑中增加判断,以定位具体字段 由于我是在报表数据库中直接写SQL,没有校验逻辑,所以想把全部字 ...

  2. SQL 字符串操作函数

    SQL 字符串操作函数 学习了: https://www.cnblogs.com/wangzhe688/p/6046654.html 一.字符转换函数 1.ASCII() 返回字符表达式最左端字符的A ...

  3. C语言关于利用sscanf实现字符串相加减

    #include<stdio.h>#include<string.h>void main(){ int a; int b; char str1[10] = "9999 ...

  4. 执行带参数的sql字符串

    --要传入的参数 declare @Rv NVARCHAR(40) --要执行的带参数的sql字符串 declare  @sql nvarchar(max) set @sql='select * fr ...

  5. 【2017-04-20】Sql字符串注入式攻击与防御

    一.攻击 所谓sql字符串注入式攻击就是在用户输入界面输入一串sql语句,来改变C#中连接数据库要执行的sql语句 通过你写的程序,直接来执行我想要执行的sql语句 例如:在这么一个程序中,sname ...

  6. 【转】String字符串相加的问题

    String字符串相加的问题 前几天同事跟我说我之前写的代码中在操作字符串时候,使用字符串相加的方式而不是使用StringBuffer或者StringBuilder导致内存开销很大.这个问题一直在困扰 ...

  7. SQL字符串操作汇总

    SQL字符串操作汇总 --将字符串中从某个字符开始截取一段字符,然后将另外一个字符串插入此处 select stuff('hello,world!',4,4,'****')   --返回值hel*** ...

  8. 通过拼接SQL字符串实现多条件查询

    一.通过拼接SQL字符串的方法的好处是: 1.方便查询条件的扩展. 2.简化业务逻辑的判断. 二.例子: 1.界面设计 2.点击查询的代码 /// <summary> /// 按条件查询 ...

  9. 【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类

    字符串攻击 所谓sql字符串注入式攻击就是在用户输入界面输入通过精心编制的含有某种指令的字符串,来改变C#中连接数据库要执行的sql语句,从而对数据库进行攻击性操作 在用户输入界面输入  a');up ...

随机推荐

  1. mobx @computed的解读

    写在前面:我一开始看不懂官网的@computed的作用,因为即使我把@computed去掉,依然能正确的report,然后我百度谷歌都找不到答案,下面都是我自己的理解,如果是有问题的,不对的,请务必留 ...

  2. javascript动画系列第三篇——碰撞检测

    前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多, ...

  3. .NET Core的日志[3]:将日志写入Debug窗口

    定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...

  4. Python碎碎念

    1. 如何添加路径 主要有以下两种方式: 1> 临时的 import sys sys.path.append('C:\Users\Victor\Desktop') 2> 永久的 在Linu ...

  5. P2V之后的磁盘扩容新思路

    背景: 原先的物理机环境多是若干块物理磁盘经过RAID卡进行了RAID5之后的虚拟磁盘组,这样我们在操作系统内看到的也就是一块完整的磁盘.我们会在上面进行分区,然后格式化后以便使用. Figure 1 ...

  6. 开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)

    在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的 ...

  7. CSharpGL(33)使用uniform块来优化对uniform变量的读写

    CSharpGL(33)使用uniform块来优化对uniform变量的读写 +BIT祝威+悄悄在此留下版了个权的信息说: Uniform块 如果shader程序变得比较复杂,那么其中用到的unifo ...

  8. ASP.NET MVC关于Ajax以及Jquery的无限级联动

    ---恢复内容开始--- 第一次发表博文,发表博文的目的是巩固自己的技术,也能够共享给大家.写的不好的地方,希望大家多给给意见.老司机勿喷 数据结构() NewsTypeId 新闻ID, NewsTy ...

  9. [WPF] Wait for a moment.

    一.控件介绍 在 WPF 中使用的等待控件,控件包括三种,普通的等待信息提示(WaitTip),进度条提示(WaitProgress),以及主程序覆盖的模拟时钟等待窗口(WaitClock),具体效果 ...

  10. Atitit  godaddy 文件权限 root权限设置

    Atitit  godaddy 文件权限 root权限设置 1. ubuntu需要先登录,再su切换到root1 2. sudo 授权许可使用的su,也是受限制的su1 3. ubuntu默认吗roo ...