(4.60)sql server isnull数据被截断

【1】isnull 的作用

在我们日常使用SQL中,isnull的作用就是判断第一个参数是否为 Null,如果是Null 值则使用第二个参数;

测试数据:

use test3
create table test1(
id int ,str char(100),str1 varchar(100)
)

insert into test1 values(1,'aaa','bbb'),(null,null,null)
select * from test1

  

select isnull(id,1),isnull(str,'b'),isnull(str,'c') from test1

  

【2】问题所在 isnull 的数据类型会是参数1

【2.1】数据被截断

select isnull(id,1),isnull(str ,replicate('a',1000)),isnull(str1,replicate('dd',1000)) from test1

如下图,

isnull(str ,replicate('a',1000))

我们明明是想要变成 1000个 a,结果只有100个,这是因为 str 字段数据类型是 char(100);

同理

isnull(str1,replicate('dd',1000))

是想要变成 1000个 dd,最后也只有100个 d

  

 我们查看字段长度

select datalength(isnull(id,1)),
datalength(isnull(str ,replicate('a',1000))),
datalength(isnull(str1,replicate('dd',1000)))
from test1

   

 查看字符个数:发现确实是截断了,只有100个字符;

    

【2.2】isnull(参数1,参数2),参数2与参数1数据类型必须相同

(1)参数2 是  参数1 的可强转类型

select isnull(id,'1'),isnull(str,'b'),isnull(str,'c') from test1

  

如上图,就是因为 '1' 可以强行转换为数字1;

(2)参数2 是  参数1 的非可强转类型

  

 如上图,本是 int 类型的 id 字段,isnull 变成 'a' 字符串,这是不行的,而且 'a' 无法强转成数字类型;

【3】解决方案(避免被截断)

其实就是把参数1的数据类型 变得更大,可以完全包含参数2 中的数据,这样就不会被截断

(1)转成固定类型

  

 (2)转成变成类型

  

原文地址:https://www.cnblogs.com/gered/p/14689602.html