Value | Catalog |
1 | CatalogA |
2 | CatalogB |
3 | CatalogB |
3 | CatalogA |
4 | CatalogA |
6 | CatalogB |
要求:按照Catalog来汇总value的乘积
自定义函数中的输入参数只能使用标量值,不能把table当参数输入!
而存储过程的输入参数则不同:
数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字
因为自定义函数可以返回一个表。
- 函数中可以使用函数
- 函数中不能使用存储过程
- 存储过程中可以使用函数
- 但存储过程中不能使用存储过程
- 事实上,存储过程能使用存储过程,比如这样:在procedure2 里面可以这样使用exec Procedure1,不过这样使用意义不是很大
创建一个自定义标量值函数
用于计算某个catalog的乘积
ALTER FUNCTION dbo.getTimeByCatalog
(
@Catalog varchar(100)
)
RETURNS real
AS
BEGIN
Declare @Timeall2 real
set @Timeall2 = 1
select @Timeall2 = @Timeall2*cast(ID as float) from TableOne
where Catalog=@catalog
return @Timeall2
END
(
@Catalog varchar(100)
)
RETURNS real
AS
BEGIN
Declare @Timeall2 real
set @Timeall2 = 1
select @Timeall2 = @Timeall2*cast(ID as float) from TableOne
where Catalog=@catalog
return @Timeall2
END
创建存储过程
ALTER PROCEDURE dbo.RockTest2
AS
begin
create table #Temp2
(
Catalog varchar(100)
)
insert into #Temp2 (Catalog) select distinct catalog from TableOne
select Catalog,dbo.getTimeByCatalog(catalog)
from #Temp2
end
AS
begin
create table #Temp2
(
Catalog varchar(100)
)
insert into #Temp2 (Catalog) select distinct catalog from TableOne
select Catalog,dbo.getTimeByCatalog(catalog)
from #Temp2
end
这样就可以得到一个乘积汇总的数据了。
当然如果还要加限制条件,可以把函数和存储过程中的TableOne换成一个带表值的自定义函数
如果大家还有好的办法,请指教12。