ITPUB论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
更多
查看: 3325|回复: 4

xzh2000 前辈能讲讲这SQL语句(是您在一回帖中写的)的思路 [复制链接]

注册会员

初级会员

精华贴数
0
技术积分
32
社区积分
0
注册时间
2007-5-28
论坛徽章:
0
发表于 2007-6-6 23:41:06 |显示全部楼层
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这列的直集合在每条记录里,到底是如何结合名字判断出来那个'一般用户'应加到李而不是张'能否结合这题具体的帮我分析一下,也许吃透了这题掌握了不少的东西.最起码能明白游标的具体的操作了.

注册会员

初级会员

精华贴数
0
技术积分
32
社区积分
0
注册时间
2007-5-28
论坛徽章:
0
发表于 2007-6-6 23:42:23 |显示全部楼层
补充一下,那题目是这样的:
一个SQL语句的问题:
select * from v_temp
上面的视图结果如下:
user_name role_name
-------------------------
系统管理员 管理员
feng 管理员
feng 一般用户
test 一般用户


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

使用道具 举报

精华贴数
0
技术积分
23982
社区积分
1684
注册时间
2007-2-21
论坛徽章:
107
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14咸鸭蛋
日期:2011-09-04 19:58:09紫蛋头
日期:2011-08-30 19:51:59蛋疼蛋
日期:2011-08-01 15:04:51复活蛋
日期:2011-07-19 20:04:42现任管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB9周年纪念徽章
日期:2010-10-08 09:34:03茶鸡蛋
日期:2012-01-17 14:36:21ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2007-6-6 23:45:01 |显示全部楼层
楼主没必要用游标,这种方法一般都是用函数来做的,你给的那个例子写的太麻烦了

使用道具 举报

注册会员

人生如梦

精华贴数
2
技术积分
6215
社区积分
5310
注册时间
2007-1-5
论坛徽章:
11
生肖徽章2007版:鼠
日期:2008-04-07 19:47:40ITPUB元老
日期:2010-01-20 10:16:00
发表于 2007-6-7 08:06:14 |显示全部楼层
-有表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
行列转换只需借助函数即可

使用道具 举报

注册会员

初级会员

精华贴数
0
技术积分
32
社区积分
0
注册时间
2007-5-28
论坛徽章:
0
发表于 2007-6-7 10:20:00 |显示全部楼层
很感谢楼上的兄弟朋友热情的回答,小弟在此表示感谢.

使用道具 举报

相关内容推荐
您需要登录后才可以回帖 登录 | 注册

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 邮箱 虎吧 老博客 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
回顶部