问一个变量赋值的问题
本帖最后由 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+课程。就是把所有的课程值都合并到一起。