问题描述
恐怕这个问题的答案是“不,你不能”,但因为我在任何地方都找不到这个解释,所以无论如何我都会问。
给定用户定义的表类型:
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 (将#修改为@)