【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)转成变成类型