SQL 服务器:从视图中,调用带有 table 值参数的函数

SQL Server: From a view, calling a function with a table-valued parameter

在SQL服务器中,如果我有一个带有table值参数参数的标量值函数,定义如下(简化示例):

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

我希望能够从视图调用该函数,其中视图的 table 值参数是从内联查询生成的,例如:

CREATE VIEW dbo.vEligibleItems AS 
    SELECT i.ItemID
    FROM tItems i
    WHERE dbo.MeetsCustomRequirements (
        (SELECT TypeID FROM tItemTypes WHERE ItemID = i.ItemID)
    );

但是,这不起作用,因为嵌套 SELECT 查询的结果不是 IntTableType(即使它 列表INT 个值)。 (生成的具体错误是 Error 206: Operand type clash: int is incompatible with IntTableType。)

我的两部分问题:有没有一种方法可以调用一个函数,该函数从视图中获取 table 值的参数参数?如果不是,有哪些替代方法可用于完成同样的事情?

数据库是 SQL Server 2008。

(将函数中的逻辑内联到视图中并不理想,因为函数是从几个不同的地方调用的,而不仅仅是从这个视图中调用的。)

我认为 VIEW

不可能

CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]

[ WITH [ ,...n ] ]

AS select_statement

[ WITH CHECK OPTION ]

[ ; ]

使用视图语法,您最多可以获得 CTE。要传递 TVP 参数,您需要在某处声明它,但不能在视图定义中进行。

非常丑陋的解决方案只是概念而不是实际代码(使用 XML 将多个值传递给辅助函数):

CREATE VIEW dbo.vEligibleItems
AS
WITH cte (view.*, XML_with_all_types_id) AS
(
    SELECT *,
       [XML_with_all_types_id] = magic_here(
            SELECT iTypeID FROM tItemTypes t WHERE WHERE t.ItemID = i.ItemID)
    FROM tItems i      
)
SELECT *
FROM cte
WHERE dbo.MeetsCustomRequirements_helper(XML_with_all_types_id) = 1

CREATE FUNCTION dbo.MeetsCustomRequirements_helper(@xml XML)
RETURNS INT
AS
(
   // unwrap xml to TVP
   DECLARE @tvp your_tvp_type;
   INSERT INTO @tvp(cols)
   SELECT *
   FROM @xml.node(...);

   DECLARE @result = dbo.MeetsCustomRequirements(@tvp);

   RETURN @result
)

您能否将视图更改为 Table-Valued User-Defined Function 并在需要时用视图覆盖它(我知道性能会很差):

CREATE VIEW name
AS
SELECT *
FROM dbo.fn_getdata();

CREATE FUNCTION dbo.fn_getdata()
RETURNS @result TABLE
AS 
BEGIN

  /* multi-statement you can declare your TVP */

END