ITPUB??ì3
ITPUB论坛 » MS SQL Server » xzh2000 前辈能讲讲这SQL语句(是您在一回帖中写的)的思路

标题: xzh2000 前辈能讲讲这SQL语句(是您在一回帖中写的)的思路
离线 ggff112
初级会员



精华贴数 0
个人空间 0
技术积分 32 (42673)
社区积分 0 (851699)
注册日期 2007-5-28
论坛徽章:0
      
      

发表于 2007-6-6 23:41 
xzh2000 前辈能讲讲这SQL语句(是您在一回帖中写的)的思路

create table a_test(name varchar(20),role2 varchar(20))

insert into a_test values('李','管理員')
insert into a_test values('張','管理員')
insert into a_test values('張','一般用戶')
insert into a_test values('常','一般用戶')

select distinct name,dbo.uf_test(name) from a_test............这里的参数name是传递的什么

create function uf_test(@n varchar(30))
returns varchar(99)
as
begin
declare cur_role2 cursor local for select role2 from a_test where name =@n
declare @r varchar(30),@ret varchar(99)
open cur_role2
fetch cur_role2 into @r
while @@fetch_status = 0
begin
if @ret is null
select @ret = @r
else
select @ret = @ret + ',' +@r
fetch cur_role2 into @r....................................在循环里的fetch 是不是就相当于游标向下移一条记录,@r有什么变化,
end
close cur_role2
return @ret
end

因为刚接触游标,想问几个问题,游标cur_role2的结果集是什么样的.得到这结果集后while是如何操作的,我一直想不同的是它怎么不是把所有的role2这列的直集合在每条记录里,到底是如何结合名字判断出来那个'一般用户'应加到李而不是张'能否结合这题具体的帮我分析一下,也许吃透了这题掌握了不少的东西.最起码能明白游标的具体的操作了.


只看该作者    顶部
离线 ggff112
初级会员



精华贴数 0
个人空间 0
技术积分 32 (42673)
社区积分 0 (851699)
注册日期 2007-5-28
论坛徽章:0
      
      

发表于 2007-6-6 23:42 
补充一下,那题目是这样的:
一个SQL语句的问题:
select * from v_temp
上面的视图结果如下:
user_name role_name
-------------------------
系统管理员 管理员
feng 管理员
feng 一般用户
test 一般用户


想把结果变成这样:
user_name role_name
---------------------------
系统管理员 管理员
feng 管理员,一般用户
test 一般用户


只看该作者    顶部
在线/呼叫 棉花糖ONE


精华贴数 0
个人空间 0
技术积分 19894 (51)
社区积分 1566 (818)
注册日期 2007-2-21
论坛徽章:71
现任管理团队成员     
      

发表于 2007-6-6 23:45 
楼主没必要用游标,这种方法一般都是用函数来做的,你给的那个例子写的太麻烦了


只看该作者    顶部
离线 caixia615
版主


精华贴数 2
个人空间 0
技术积分 6025 (257)
社区积分 5292 (328)
注册日期 2007-1-5
论坛徽章:10
生肖徽章2007版:牛生肖徽章2007版:鼠2008新春纪念徽章   
      

发表于 2007-6-7 08:06 
-有表t,其数据如下:
  a b
  1 1
  1 2
  1 3
  2 1
  2 2
  3 1
--如何转换成如下结果:
  a b
  1 1,2,3
  2 1,2
  3 1
create table tb
(
  a int,
  b int
)
insert into tb(a,b) values(1,1)
insert into tb(a,b) values(1,2)
insert into tb(a,b) values(1,3)
insert into tb(a,b) values(2,1)
insert into tb(a,b) values(2,2)
insert into tb(a,b) values(3,1)
go

--创建一个合并的函数
create function f_hb(@a int)
returns varchar(8000)
as
begin
  declare @str varchar(8000)
  set @str = ''
  select @str = @str + ',' + cast(b as varchar) from tb where a = @a
  set @str = right(@str , len(@str) - 1)
  return(@str)
End
go

--调用自定义函数得到结果:
select distinct a ,dbo.f_hb(a) as b from tb

drop table tb

--结果
a           b     
----------- ------
1           1,2,3
2           1,2
3           1
行列转换只需借助函数即可


__________________
如果我是你眼中的一滴泪 我会努力的流下来流到你嘴裏, 因为我真的想吻你. 如果你是我眼中的一滴泪, 那麽我会永远不会哭泣, 因为我怕失去你...
只看该作者    顶部
离线 ggff112
初级会员



精华贴数 0
个人空间 0
技术积分 32 (42673)
社区积分 0 (851699)
注册日期 2007-5-28
论坛徽章:0
      
      

发表于 2007-6-7 10:20 
很感谢楼上的兄弟朋友热情的回答,小弟在此表示感谢.


只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰网域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:060528号 联系我们 法律顾问