РЕДАКТИРОВАТЬ : Основываясь на ответах ниже, я добавил «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