编辑:根据以下答案,我添加了“dbo”。和澄清的评论。
问题:如何将SQL用户定义函数(UDF)作为另一个UDF的参数传递?请注意,该函数返回一个表。
select dbo.fn_Scalar() -- Returns 'sa'.
select * from dbo.fn_Tabler('sa') -- Returns a table (not scalar).
select dbo.fn_ScalarArg(dbo.fn_Scalar()) -- Returns 'sa'
select * from dbo.fn_Tabler(dbo.fn_Scalar()) -- ERROR: Incorrect syntax near '.'.
(目前使用的是SQL Server 2008 R2)
编辑:为了简化调试,以下是创建上述功能的示例代码:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_Scalar]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION dbo.fn_Scalar
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_Tabler]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION dbo.fn_Tabler
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_ScalarArg]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION dbo.fn_ScalarArg
GO
create function fn_Scalar()
returns char(200) as
begin
declare @user char(200)
select @user = 'sa'
return @user
end
GO
create function fn_Tabler(@User char(200))
returns table as
return select @User [User]
GO
create function fn_ScalarArg(@User char(200))
returns char(200) as
begin
declare @u2 char(200)
select @u2 = @User
return @u2
end
go
答案 0 :(得分:1)
它为我工作
select [dbo].[GetOverAllWinLossDetailPointByDay]
(1,0,1,dbo.GetOverAllWinLossDetailPointByDay(1,0,1,1))
我想您忘记在功能名称前添加 dbo 。
答案 1 :(得分:0)
BOL说:“必须至少使用函数的两部分名称来调用标量值函数。”
select * from dbo.fn_Tabler(dbo.fn_Scalar())
编辑: 我错了,有表值函数......文档说只有常量和@local_variables可以传递给表值函数(see here)