SQL Server 中 自定义函数 和 游标 应用的经典案例
2011-04-23 23:53
351 查看
问题:
假设环境如下:
表1: ID, NAME, QQ, PHONE,
表中数据: 1 秦云 10102800 13500000
2 在路上 10378 13600000
3 LEO 10000 13900000
表2: ID, NAME, 上机时间,管理员,
表中数据: 1 秦云 2004-1-1 李大伟
2 秦云 2005-1-1 马化腾
3 在路上 2005-1-1 马化腾
4 秦云 2005-1-1 李大伟
5 在路上 2005-1-1 李大伟
实现目的:从表1中取所有人员列表,从表2中取上机次数和管理员.
上机人员名单 上机次数 管理员(上这几次机的每个管理员都列出来)
秦云 3 李大伟,马化腾,李大伟
在路上 2 马化腾,李大伟
LEO 0
如果不算管理员那一列的话,我是这样写的。
SELECT 表1.NAME AS 姓名, COUNT(表2.ID) AS 上机次数
FROM 表1 LEFT OUTER JOIN
表2 ON 表1.NAME = 表2.NAME
GROUP BY 表1.名称
解答:
测试用例
create table 表1( --drop table 表1
ID int,
NAME varchar(10),
QQ varchar(10),
PHONE varchar(20)
)
insert into 表1 values(1 ,'秦云' ,'10102800' ,'13500000')
insert into 表1 values(2 ,'在路上' ,'10378' ,'13600000')
insert into 表1 values(3 ,'LEO' ,'10000' ,'13900000')
create table 表2( --drop table 表2
ID int,
NAME varchar(10) ,
上机时间 datetime,
管理员 varchar(10)
)
insert into 表2 values(1,'秦云' ,cast('2004-1-1' as datetime),'李大伟')
insert into 表2 values(2,'秦云' ,cast('2005-1-1' as datetime),'马化腾')
insert into 表2 values (3,'在路上' ,cast('2005-1-1' as datetime),'马化腾')
insert into 表2 values(4,'秦云' ,cast('2005-1-1' as datetime),'李大伟')
insert into 表2 values(5,'在路上' ,cast('2005-1-1' as datetime),'李大伟')
程序部分
create function GetNameStr(@name nvarchar(10))
returns nvarchar(800)
as
begin
declare @nameStr nvarchar(800)
declare @tempStr nvarchar(800)
declare @flag int
declare myCur cursor for ( select 管理员 from 表2 where 表2.NAME = @name )
open myCur
fetch next from myCur into @tempStr
set @flag = 0
while @@fetch_status = 0
begin
if @flag = 0
begin
set @nameStr = @tempStr
end
else
begin
set @nameStr = @nameStr + ',' + @tempStr
end
set @flag = @flag + 1
fetch next from myCur into @tempStr
end
close myCur
deallocate myCur
return @nameStr
end
select 表2.NAME as 姓名, count(ID) as 上机次数, dbo.GetNameStr(表2.NAME) as 管理员
from 表2
where 表2.NAME in ( select 表1.NAME from 表1 )
group by 表2.NAME
测试结果:
姓名 上机次数 管理员
--------------------------------------------------------------
秦云 3 李大伟,马化腾,李大伟
在路上 2 马化腾,李大伟
if ($ != jQuery) {
$ = jQuery.noConflict();
}
var isLogined = true;
var cb_blogId = 87629;
var cb_entryId = 2021505;
var cb_blogApp = "yellowapplemylove";
var cb_blogUserGuid = "d9c6f571-356a-e011-a53f-842b2b196315";
var cb_entryCreatedDate = '2011/4/19 21:06:00';
假设环境如下:
表1: ID, NAME, QQ, PHONE,
表中数据: 1 秦云 10102800 13500000
2 在路上 10378 13600000
3 LEO 10000 13900000
表2: ID, NAME, 上机时间,管理员,
表中数据: 1 秦云 2004-1-1 李大伟
2 秦云 2005-1-1 马化腾
3 在路上 2005-1-1 马化腾
4 秦云 2005-1-1 李大伟
5 在路上 2005-1-1 李大伟
实现目的:从表1中取所有人员列表,从表2中取上机次数和管理员.
上机人员名单 上机次数 管理员(上这几次机的每个管理员都列出来)
秦云 3 李大伟,马化腾,李大伟
在路上 2 马化腾,李大伟
LEO 0
如果不算管理员那一列的话,我是这样写的。
SELECT 表1.NAME AS 姓名, COUNT(表2.ID) AS 上机次数
FROM 表1 LEFT OUTER JOIN
表2 ON 表1.NAME = 表2.NAME
GROUP BY 表1.名称
解答:
测试用例
create table 表1( --drop table 表1
ID int,
NAME varchar(10),
QQ varchar(10),
PHONE varchar(20)
)
insert into 表1 values(1 ,'秦云' ,'10102800' ,'13500000')
insert into 表1 values(2 ,'在路上' ,'10378' ,'13600000')
insert into 表1 values(3 ,'LEO' ,'10000' ,'13900000')
create table 表2( --drop table 表2
ID int,
NAME varchar(10) ,
上机时间 datetime,
管理员 varchar(10)
)
insert into 表2 values(1,'秦云' ,cast('2004-1-1' as datetime),'李大伟')
insert into 表2 values(2,'秦云' ,cast('2005-1-1' as datetime),'马化腾')
insert into 表2 values (3,'在路上' ,cast('2005-1-1' as datetime),'马化腾')
insert into 表2 values(4,'秦云' ,cast('2005-1-1' as datetime),'李大伟')
insert into 表2 values(5,'在路上' ,cast('2005-1-1' as datetime),'李大伟')
程序部分
create function GetNameStr(@name nvarchar(10))
returns nvarchar(800)
as
begin
declare @nameStr nvarchar(800)
declare @tempStr nvarchar(800)
declare @flag int
declare myCur cursor for ( select 管理员 from 表2 where 表2.NAME = @name )
open myCur
fetch next from myCur into @tempStr
set @flag = 0
while @@fetch_status = 0
begin
if @flag = 0
begin
set @nameStr = @tempStr
end
else
begin
set @nameStr = @nameStr + ',' + @tempStr
end
set @flag = @flag + 1
fetch next from myCur into @tempStr
end
close myCur
deallocate myCur
return @nameStr
end
select 表2.NAME as 姓名, count(ID) as 上机次数, dbo.GetNameStr(表2.NAME) as 管理员
from 表2
where 表2.NAME in ( select 表1.NAME from 表1 )
group by 表2.NAME
测试结果:
姓名 上机次数 管理员
--------------------------------------------------------------
秦云 3 李大伟,马化腾,李大伟
在路上 2 马化腾,李大伟
if ($ != jQuery) {
$ = jQuery.noConflict();
}
var isLogined = true;
var cb_blogId = 87629;
var cb_entryId = 2021505;
var cb_blogApp = "yellowapplemylove";
var cb_blogUserGuid = "d9c6f571-356a-e011-a53f-842b2b196315";
var cb_entryCreatedDate = '2011/4/19 21:06:00';
相关文章推荐
- SQL Server 中 自定义函数 和 游标 应用的经典案例
- SQL Server 中 自定义函数 和 游标 应用的经典案例
- SQL Server 中 自定义函数 和 游标 应用的经典案例
- SQL Server 中 自定义函数 和 游标 应用的经典案例
- SQL Server中自定义函数和游标应用的经典案例
- 中自定义函数和游标应用的经典案例
- Linux 学习笔记_12_Windows与Linux文件共享服务_1.1_--Samba(下)Samba经典应用案例
- SQL Server 日常维护经典应用
- SQL Server 日常维护经典应用
- 网页设计趋势:模糊背景在网站中的经典应用案例
- SQL Server 2008编程入门经典笔记:用户自定义函数
- Linux 学习笔记_12_Windows与Linux文件共享服务_1.1_--Samba(下)Samba经典应用案例
- 经典网页设计:六边形在网页设计中应用的精美案例
- Linux 学习笔记_12_Windows与Linux文件共享服务_1.1_--Samba(下)Samba经典应用案例
- Linux 学习笔记_12_Windows与Linux文件共享服务_1.1_--Samba(下)Samba经典应用案例
- 经典网页设计:30个创意的 CSS 应用案例
- Silverlight经典应用案例整理
- 经典网页设计:六边形在网页设计中应用的精美案例
- 【深度文章】2015年度大数据应用经典案例Top 100