如何创建一个交叉APPLY一系列内联表值UDF的视图



以下是我正在查看的代码结构:

CREATE VIEW [dbo].[View1]
AS SELECT t1.[ID]        ,
udf1.[Column1] ,
udf1.[Column2] ,
udf1.[Column3]
FROM [Table1] t1
CROSS APPLY [dbo].[UDF1] ( [dbo].[UDF2] ( t1.[ID] ) ) udf1
GO

CCD_ 1和CCD_ 2都是内联表值函数。

我不记得确切的细节,但当我尝试使用JOIN时,SSMS给了我错误,SO告诉我需要使用CROSS APPLY来修复它——我认为这是正确的选择?

无论如何,我现在的主要问题是:

找不到列"dbo"或用户定义函数或聚合"dbo.UDF2",或者名称不明确。

。。。尽管CCD_ 5显然存在:我可以在SSMS中看到它。

我怀疑真正的问题是UDF2作为参数传递到UDF1中的方式
UDF2返回一个表,列与为UDF1定义的表值参数完全匹配。

但是我认为SQL Server不支持这种语法
是否需要将视图转换为多行表值函数,声明一个表变量以接收[dbo].[UDF1]0的结果,然后将该表变量传递到UDF1

(附言:SQL Server的错误是我见过的任何语言中帮助最小的错误…(

这可能会有非常糟糕的性能,但我认为您需要为每个表值函数使用一个单独的CROSS APPLY。我认为不可能在UDF1中使用UDF2返回的内容,因为UDF1需要一个Table Type的参数,而UDF2返回一个Table而不是Table Type。

函数不能返回表类型,因此您可能需要找到其他解决方案。您可以创建另一个函数,将UDF2的结果插入到表类型中,然后调用UDF1。

如果你能做到,它会看起来像:

CREATE VIEW [dbo].[View1]
AS SELECT t1.[ID]        ,
udf1.[Column1] ,
udf1.[Column2] ,
udf1.[Column3]
FROM [Table1] t1
CROSS APPLY [dbo].[UDF2] ( t1.[ID] ) udf2
CROSS APPLY [dbo].[UDF1] ( udf2 ) udf1
GO

要创建"另一个包装器函数",它看起来像:

CREATE FUNCTION [dbo].[UDF3](
@id INT -- data type for t1.ID
) RETURNS @t TABLE (
-- ... Your columns here ...
) 
AS
BEGIN
-- Your user defined Table Type
DECLARE @udf2 UDF2_TABLE 
INSERT @udf2 (... columns ...)
SELECT udf2.* -- try to use exact column names instead of *
FROM [Table1] t1
CROSS APPLY [dbo].[UDF2]( t1.[ID] )
-- I'm not really sure this is possible either
INSERT @t (... columns ...)
SELECT udf1.*
FROM [dbo].[UDF1](@udf2) udf1
RETURN;
END

最新更新