【发布时间】:2018-10-26 02:26:51
【问题描述】:
这是我正在查看的代码结构:
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
[dbo].[UDF1] 和 [dbo].[UDF2] 都是内联表值函数。
我不记得确切的细节,但是当我尝试使用 JOIN 时 SSMS 给了我错误,所以告诉我我需要使用 CROSS APPLY 来修复它 - 我认为这是正确的选择吗?
无论如何,我现在的主要问题是:
找不到列“dbo”或用户定义的函数或聚合“dbo.UDF2”,或者名称不明确。
...尽管UDF2 显然存在:我可以在 SSMS 中看到它。
我怀疑真正的问题是UDF2 作为参数传递到UDF1 的方式。UDF2 返回一个表,并且列与为UDF1 定义的表值参数完全匹配。
但我认为 SQL Server 不支持这种语法?
是否需要将视图转换为多行表值函数,声明一个表变量以接收UDF2 的结果,然后将该表变量传递给UDF1?
(P.S. SQL Server 的错误是我见过的最没有帮助的错误,在任何语言中......)
【问题讨论】:
-
哎呀,这会表现得很糟糕。
-
@ErikPhilips 有没有更好的替代方案?我想我认为内联函数在这种情况下表现得很好......但我不太了解
CROSS APPLY,所以...... -
不要使用 UDF。
-
@ErikPhilips(另外,我觉得我应该提一下,这是在内存中的 OLTP 数据上运行,而不是在硬盘上运行。所以性能不会像 相当看起来很糟糕。)
标签: sql sql-server user-defined-functions sql-server-2017