如何将函数返回的用户定义表类型作为参数传递给另一个内联函数不带“DECLARE”?

问题描述

恐怕这个问题的答案是“不,你不能”,但因为我在任何地方都找不到这个解释,所以无论如何我都会问。

给定用户定义的表类型:

CREATE TYPE MyType AS TABLE(
    [Id]        UNIQUEIDENTIFIER NOT NULL,[Name]      NVARCHAR(200) NOT NULL
)

还有一个返回该类型的函数:

CREATE FUNCTION [dbo].[fnFind]
(
    @info UNIQUEIDENTIFIER
)
RETURNS TABLE AS
RETURN( SELECT TOP 1 Id,Name FROM TblUsers WHERE Id = @info );

另一个接受该类型的函数:

CREATE FUNCTION [dbo].[fnName]
(
    @single MyType READONLY
)
RETURNS TABLE AS
RETURN( SELECT TOP 1 Name,42 AS NextColumn,43 AS MoreCols FROM @single );

由于 fnFind 的返回值符合 fnName 接受的值,所以我希望我可以执行以下操作:

SELECT * FROM SomeOtherTable sot 
INNER JOIN dbo.fnName(dbo.fnFind(sot.Id)) f ON sot.Id = f.Id

-- OR using the select-syntax,since it is a table
SELECT * FROM SomeOtherTable sot 
INNER JOIN dbo.fnName((SELECT * FROM dbo.fnFind(sot.Id))) f ON sot.Id = f.Id

不幸的是,该语法会导致错误。可能,如果我将它添加到多语句脚本或函数中,我可以分配它并传递它,但是如果我想在一行 TVF 中使用这样的构造,我相信我不能使用 DECLARE 语句.所以我希望有一些语法可以做到这一点。

(抱歉上面函数的简单性,只是为了说明这一点。目前使用在触发器内,所以我可以使用多个语句,但我想在 {{1} 中使用它} 语句,这将需要这种“功能管道”)

更新:这就是我正在努力实现的目标。我知道我可以通过使用游标或其他一些魔法来做到这一点,但由于逻辑表 SELECT 有一个或多个行,我不能简单地声明一个变量:

此处 inserted 采用 UDTT,fnGetMatchingKey 返回与该 UDTT 具有相同架构的表,但似乎不允许使用此语法:

fnGetSearchFields

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)