SQL Server: функция в качестве аргумента для другой функции - PullRequest
2 голосов
/ 19 августа 2011

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

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Это работает для меня

    select [dbo].[GetOverAllWinLossDetailPointByDay] 
               (1,0,1,dbo.GetOverAllWinLossDetailPointByDay(1,0,1,1))

Я думаю, что вы забыли добавить dbo перед именем функции.

0 голосов
/ 19 августа 2011

BOL говорит: «Скалярные функции должны вызываться, используя как минимум двухкомпонентное имя функции».

select * from dbo.fn_Tabler(dbo.fn_Scalar())    

РЕДАКТИРОВАТЬ: я был неправ, есть табличная функция ... Документация говорит, что только константы и @local_variables могут быть переданы в табличные функции ( см. Здесь )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...