2016-12-01 72 views
0

我有,它返回基于参数的一组行,它看起来像这样例子的表函数:T-SQL调用表函数传递多个值和聚合结果

CREATE FUNCTION fn_get_records 
(@PARENTID INT) 
RETURNS @returnTable TABLE 
(
    -- columns returned by the function 
    Id INT NOT NULL, 
    Parent_Id INT NOT NULL, 
    Name VARCHAR(255) NOT NULL 
) 
AS 
BEGIN 
    -- This select returns data 
    INSERT INTO @returnTable (Id, ParentId, Name) 
    SELECT Id, ParentId, Name FROM [whatever] where Parent_Id = @PARENTID 
RETURN 
END 

我有一个包含另一个表这些“Parent Id”的列表,我应该为每个Parent_Id调用匹配特定查询的前一个函数并聚合所有结果。

父ID是使用类似

SELECT Parent_Id 
FROM Parent_Records 
WHERE Country = 'USA' 

此选择的回报,例如,4行检索。对于每一行,我必须执行我的功能fn_get_records并将所有结果汇总在一个视图或另一个函数中。

这有可能吗? 当然,我不希望因为我需要的东西快速使用游标

回答

1

只是一个快速的FYI:一种更有效的TVF将是一个单独的语句

CREATE FUNCTION fn_get_records (@PARENTID INT) 
RETURNS TABLE 
AS 
RETURN (
    SELECT Id, ParentId, Name FROM [whatever] where Parent_Id = @PARENTID 
) 
END 

然后你就可以通过交叉调用你的函数应用。例如:

Select A.* 
     ,B.* 
From YourTable A 
Cross Apply dbo.fn_get_records (A.SomeIntValue) B 
+0

我想我从来没有使用CROSS APPLY语句,直到今天。 :-D – Raffaeu

+1

@Raffaeu这是一个很棒的功能。把它看作记录级处理的子程序。 Google CROSS APPLY和OUTER APPLY。总是乐于学习新的东西。 –