日期:2014-05-17  浏览次数:20569 次

问一个变量赋值的问题
本帖最后由 SilverNet 于 2014-01-04 11:47:59 编辑
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
------------------------------

为什么使用

declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
print(@sql)

会输出
语文],[数学],[物理


主要是不知道为什么isnull配合上SELECT就能把所有的数据都赋值到变量里去了。

补上建表语句

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)


------解决方案--------------------
不建议使用isnull这种方法,因为不够灵活。

其实你上面的代码之所以需要isnull是因为,一开始的时候@sql变量,由于没有初始化,那么在sql server中是默认为null的,所以才需要用isnull来进行转化,只不过对于 [ ] 这种格式来说,isnull不够灵活。


另外,就是之所以能把值都赋给变量,其实:

select @sql = @sql + ',['+课程 +']' 
from tb group by 课程

这种方式,就是有点想循环,累加的过程,对于课程 先进行group by,其实就是去重,然后每次,把一个课程,通过 
select @sql = @sql + ',['+课程 +']' 
放到@sql变量中,实现了字符串的累加效果。


------解决方案--------------------

drop table tb;
create table tb(姓名 nvarchar(10) , 课程 nvarchar(10) , 分数 int)
insert into tb values(N'张三' , N'语文' , 74)
insert into tb values(N'张三' , N'数学' , 83)
insert into tb values(N'张三' , N'物理' , 93)
insert into tb values(N'李四' , N'语文' , 74)
insert into tb values(N'李四' , N'数学' , 84)
insert into tb values(N'李四' , N'物理' , 94)

select * from tb;

declare @sql Nvarchar(4000)=N'';
select @sql = @sql  + 课程 from tb group by 课程
print(@sql)


这个不用isnull也是这样的。用isnull主要是null+字符串结果为null。isnull主要是用来处理null值。

把所有的数据都赋值到变量里去,主要是用了@sql+课程。就是把所有的课程值都合并到一起。