在SQL Server中,如果我有一个采用表值参数参数的标量值函数,其定义如下(简化示例):SQL Server:从视图调用具有表值参数的函数
CREATE TYPE IntTableType AS TABLE(Value INT);
CREATE FUNCTION dbo.MeetsCustomRequirements
(
@TypeIDs IntTableType READONLY
)
RETURNS TINYINT AS
BEGIN
-- (Function logic here; returns either 0 or 1 based on the specified @TypeIDs values)
END
我想能够调用该函数从一个视图,其中从一个内联查询生成的视图的表值参数,如:
CREATE VIEW dbo.vEligibleItems AS
SELECT i.ItemID
FROM tItems i
WHERE dbo.MeetsCustomRequirements (
(SELECT TypeID FROM tItemTypes WHERE ItemID = i.ItemID)
);
然而,这并未” t工作,因为嵌套SELECT查询的结果不是IntTableType
(即使它是是值的列表INT
值)。 (生成的具体错误是Error 206: Operand type clash: int is incompatible with IntTableType
。)
我的两部分问题:有没有办法调用一个从视图中获取表值参数参数的函数?如果没有,还有什么替代方法可以完成同样的事情?
数据库是SQL Server 2008的
(瞻逻辑视图中的函数内联并不理想,因为该功能是由几个不同的地方,而不是仅仅从这一说法叫。)
也许你需要CROSS APPLY – lad2025
您可以更改标量函数为内嵌表值函数?请注意,这意味着一个选择语句。如果你有多个陈述,这不会有帮助,实际上表现可能会更糟。那么交叉应用是一种更好的方法。仔细看看你那里的谓词。你有一个标量函数,但是你试图把它传递给一个整列,你也需要一些条件。 –
是的,这似乎更好地直接在tItems和tItemTypes之间进行内部连接。 'dbo.MeetsCustomRequirements'中有什么样的逻辑? – ps2goat