函数调用函数时,调用函数如何将参数传给被调用函数

一面面试官 2009-08-12 11:20:38
1.数据库是SQLServer2005
2.首先定义了一个表值函数 ,主要信息为:(需要传递2个参数)
alter FUNCTION getAirportCoupleMonthStat
(
@deptID varchar(50),
@year varchar(4)
)
RETURNS @temp_tbl_airportCouple TABLE
(
-- Add the column definitions for the TABLE variable here
takeoffID varchar(50),
arrivedID varchar(50),
airportCouple varchar(100),
num int
)
特别声明,函数getAirportCoupleMonthStat是正确的,直接调用有返回结果
3.再定义一个调用该表值函数的表值函数
ALTER FUNCTION getAirCoupTop5MonthStat
(
-- Add the parameters for the function here
@deptID varchar(20),
@yearMonth varchar(4)
)
RETURNS
@temp_AirCoupTop5Month TABLE
(
-- Add the column definitions for the TABLE variable here
takeoffID varchar(20),
arrivedID varchar(20),
airportCouple varchar(40),
num int
)

AS
BEGIN
--我担心是参数名称相冲突,故多此一举,声明不同名字的变量,再传递给被调用函数
--但实际上是:两者都没有返回返回结果
declare @paramDept varchar(20)
set @paramDept = @deptID
declare @paramMonth varchar(20)
set @paramMonth = @yearMonth

insert @temp_AirCoupTop5Month
select top 5 takeoffID,arrivedID,airportCouple,num
from dbo.getAirportCoupleMonthStat (@paramDept, @paramMonth)
order by num desc
/*同样没有查询结果
insert @temp_AirCoupTop5Month
select top 5 takeoffID,arrivedID,airportCouple,num
from dbo.getAirportCoupleMonthStat (@deptID, @yearMonth)
order by num desc
*/
/*直接写上参数,有查询结果
insert @temp_AirCoupTop5Month
select top 5 takeoffID,arrivedID,airportCouple,num
from dbo.getAirportCoupleMonthStat ('V00989b3bV', '2009-07')
order by num desc
*/
RETURN
END

然后,调用函数:
SELECT takeoffID,arrivedID,airportCouple,num
FROM dbo.getAirCoupTop5MonthStat('V00989b3bV','2009-07')

查询结果为空.
在函数中,直接写上参数,能够查询到结果。

请问,我应该如何传递参数呢?
还是SQLserver不支持?
...全文
265 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
一面面试官 2009-08-12
  • 打赏
  • 举报
回复
分数有限,万望见谅。
初出道啊。
SQL77 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 ivan_ivmy_li 的回复:]
SQL77 我会给你10分,
另外十分,我给htl258和阿迪
我知道你们都旨在这份数。

谢谢htl258和阿迪,教会我,让我知道我可以写小DEMO验证。
谢谢SQL77帮我解决问题。

谢谢各位大侠朋友的关注。
[/Quote]
太客气了
一面面试官 2009-08-12
  • 打赏
  • 举报
回复
SQL77 我会给你10分,
另外十分,我给htl258和阿迪
我知道你们都旨在这份数。

谢谢htl258和阿迪,教会我,让我知道我可以写小DEMO验证。
谢谢SQL77帮我解决问题。

谢谢各位大侠朋友的关注。
一面面试官 2009-08-12
  • 打赏
  • 举报
回复
SQL77
你是正确的。

对不起啊,各位,我太粗心了。

因为还有一个年统计,用的是年。
粘贴错了。

改成varchar(7)就好使了。

谢谢。

原来varchar 不是自动变长的?
SQL77 2009-08-12
  • 打赏
  • 举报
回复
lter FUNCTION getAirportCoupleMonthStat
(
@deptID varchar(50),
@year varchar(4)
)
getAirportCoupleMonthStat ('V00989b3bV', '2009-07')
应该是这里的长度问题了,改成@year varchar(7)
gw6328 2009-08-12
  • 打赏
  • 举报
回复
第一个函数定义完后要有个go
一面面试官 2009-08-12
  • 打赏
  • 举报
回复
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER function [dbo].[fn_001](@i int)
returns table
as
return
select @i*2 as num

ALTER function [dbo].[fn_002](@i int)
returns @t table (num2 int)
as
begin
insert @t
select num+@i from fn_001(@i)
return
end

select * from fn_002(4)

返回12,好使。

但我的方法,却没有结果。
我的方法各自都是正确的,
不使用变量做参数,而是写明
insert @temp_AirCoupTop5Month
select top 5 takeoffID,arrivedID,airportCouple,num
from dbo.getAirportCoupleMonthStat ('V00989b3bV', '2009-07')
order by num desc

也是有返回结果的,
但是变成变量就没结果了。
郁闷
SQL77 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ivan_ivmy_li 的回复:]
对不起,好使啊。

但为什么我传递参数却没有结果呢?
郁闷
[/Quote]
呵呵,语句哪里有问题,找找看?
htl258_Tony 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ivan_ivmy_li 的回复:]
对不起,好使啊。

但为什么我传递参数却没有结果呢?
郁闷
[/Quote]
检查一下,方向正确就很快能找到问题.
一面面试官 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xuejie09242 的回复:]
@yearMonth varchar(4) ?
那你为什么传递年度和月份 呢?
感觉没必要用两个函数,一个足够了。或者改为存储过程吧。
[/Quote]
想按照月份统计信息
htl258_Tony 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 feixianxxx 的回复:]
引用 10 楼 htl258 的回复:
SQL codecreatefunction fn_001(@iint)returnstableasreturnselect@i*2as numgo/*
select * from fn_001(8)
-----------------------
num
-----------
16

(1 行受影响)*/createfunction fn_002(@iint)returns@ttable (n¡­

标量函数不可以嵌套么?
[/Quote]没说不行啊,只是我在测试表值函数.
一面面试官 2009-08-12
  • 打赏
  • 举报
回复
对不起,好使啊。

但为什么我传递参数却没有结果呢?
郁闷
gw6328 2009-08-12
  • 打赏
  • 举报
回复

ALTER FUNCTION FUN1(@A INT)
RETURNS INT
AS
BEGIN
RETURN @A
END
GO
ALTER FUNCTION FUN2(@B INT,@A INT)
RETURNS INT
AS
BEGIN
RETURN @B+DBO.FUN1(@A)
END
GO
DECLARE @x INT
SET @x=1
DECLARE @y INT
SET @Y=2
SELECT DBO.FUN2(@x,@y)

这样好像都行
一面面试官 2009-08-12
  • 打赏
  • 举报
回复
楼上的各位大哥,调用函数时,直接写上实际的参数 例如你们所说的 8,是可以的。这个
我试了。

但是,我现在想传递给函数的也是一个参数;
例如
create function fn_002(@i int)
returns @t table (num2 int)
as
begin
insert @t
select num+@i from fn_001(@i)
--而不是select num+@i from fn_001(8)
return
end
go

select * from fn_002(4)

我还没试这个DEMO,我感觉不行
feixianxxx 2009-08-12
  • 打赏
  • 举报
回复
create function fn_001(@i int)
returns int
as
begin
return (@i*2)
end
go

create function fn_002(@i int)
returns @t table (num2 int)
as
begin
insert @t
values(dbo.fn_001(8)+@i)
return
end
go

select * from fn_002(4)
---
20

随手测试下
一面面试官 2009-08-12
  • 打赏
  • 举报
回复
我正在改为存储过程,
我也知道一个函数可以实现,
但我想想,被调用的函数是各种信息的结果集,
我用其他函数可以对这个结果集作用,处理。
这样可以通用一点。
所以想写两个。
feixianxxx 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 htl258 的回复:]
SQL codecreatefunction fn_001(@iint)returnstableasreturnselect@i*2as numgo/*
select * from fn_001(8)
-----------------------
num
-----------
16

(1 行受影响)*/createfunction fn_002(@iint)returns@ttable (n¡­
[/Quote]
标量函数不可以嵌套么?
htl258_Tony 2009-08-12
  • 打赏
  • 举报
回复
应该是你的代码某个地方有问题.
htl258_Tony 2009-08-12
  • 打赏
  • 举报
回复
create function fn_001(@i int)
returns table
as
return
select @i*2 as num
go
/*
select * from fn_001(8)
-----------------------
num
-----------
16

(1 行受影响)
*/
create function fn_002(@i int)
returns @t table (num2 int)
as
begin
insert @t
select num+@i from fn_001(8)
return
end
go

select * from fn_002(4)
/*
num2
-----------
20

(1 行受影响)
*/
表值函数可以嵌套
xuejie09242 2009-08-12
  • 打赏
  • 举报
回复
@yearMonth varchar(4) ?
那你为什么传递年度和月份 呢?
感觉没必要用两个函数,一个足够了。或者改为存储过程吧。
加载更多回复(8)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧