[数据库] ::[ZZ]表值函数增强功能
以前我们使用表值函数,只能用select * from 表值函数 的形式,如果我们想和别的表连接就做不到了.现在2005新增的{CROSS | OUTER} APPLY运算符可以让我们轻松的做到这一点.下边我就以一个例子来说明.
表1(t):sail cmd
9258 LBQR|LB
92587 A|19|1
想变成如下的形式:
sail cmd
9258 LBQR
9258 LB
92587 A
92587 19
92587 1
-- 步骤1:表值函数
create function dbo.fn_t(@sail int,@cmd varchar(1000))
returns @tb_t table(sail int,cmd varchar(1000))
as
begin
while(charindex('|',@cmd)>0) -- 循环取得列表值,并插入@tb_t表里边.
begin
insert @tb_t select @sail,left(@cmd,charindex('|',@cmd)-1)
set @cmd=stuff(@cmd,1,charindex('|',@cmd),'')
end
insert @tb_t select @sail,@cmd -- 插入最后一个值
return
end
Go
-- 步骤2:查询
select t.sail,b.cmd
from t
cross apply dbo.fn_t(t.sail,t.cmd) b
order by t.sail