您的位置:首页 > 移动开发

用于分拆字符串的表值函数--cross apply & outer apply

2010-06-18 15:32 309 查看
/*
功能:将短信分成普通短信
Author:庄项琨
select *
from dbo.uf_MultiMsg('【仁】即人与人之间的亲情善意,是儒家理论和传统道德的核心,其他具体的道德准则都由此衍生而来。仁的根本宗旨是爱人,即对人的亲近与善待。对于什么是“仁”,孔子曰“爱人”,孟子云“仁者爱人”。仁与爱是因果关系,仁是本质,爱是表现,正如朱熹所说“仁者,爱之理。”')

*/

ALTER function [dbo].[uf_MultiMsg](
@Msg varchar(max)
)
returns @tabel table ([PK_Total] [int] not null, [PK_Number] [int] NOT NULL, Msg varchar(max))
as
begin

declare @pknumber int
declare @pktotal int
declare @msgtemp varchar(500)
set @pktotal = ceiling(len(@Msg) / 67.0)
set @pknumber = 1

while @pktotal >= @pknumber
begin

set @msgtemp = substring(@Msg, (@pknumber - 1) * 67 + 1, 67)

insert into @tabel
select @pktotal, @pknumber, @msgtemp

set @pknumber = @pknumber + 1

end

return

end

select *
from a_test
cross apply dbo.uf_MultiMsg(msg)

--------------------------------------------------------------

create table #T(姓名 varchar(10))
insert into #T values('张三')
insert into #T values('李四')

create table #T2(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into #T2 values('张三' , '语文' , 74)
insert into #T2 values('张三' , '数学' , 83)
insert into #T2 values('张三' , '物理' , 93)
insert into #T2 values('李四' , '语文' , 90)
insert into #T2 values('李四' , '数学' , 66)
insert into #T2 values('李四' , '物理' , 88)

-- cross apply的经典用法;求每个人考试科目中成绩的前两名(取出每组中的前几名)
select * from #t t
cross apply
(select top 2 * from #t2 where 姓名=t.姓名 order by 分数 desc) as o

/*
姓名 姓名 课程 分数
---------- ---------- ---------- -----------
张三 张三 物理 93
张三 张三 数学 83
李四 李四 语文 90
李四 李四 物理 88
*/

create table #T(姓名 varchar(10))
insert into #T values('张三')
insert into #T values('李四')
insert into #T values(NULL )

create table #T2(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into #T2 values('张三' , '语文' , 74)
insert into #T2 values('张三' , '数学' , 83)
insert into #T2 values('张三' , '物理' , 93)
insert into #T2 values(NULL , '数学' , 50)

--drop table #t,#T2
go

select
*
from
#T a
cross apply
(select 课程,分数 from #t2 where 姓名=a.姓名) b

/*
姓名 课程 分数
---------- ---------- -----------
张三 语文 74
张三 数学 83
张三 物理 93

(3 行受影响)

*/

select
*
from
#T a
outer apply
(select 课程,分数 from #t2 where 姓名=a.姓名) b
/*
姓名 课程 分数
---------- ---------- -----------
张三 语文 74
张三 数学 83
张三 物理 93
李四 NULL NULL
NULL NULL NULL

(5 行受影响)

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: