2016-12-01 71 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。總是樂於學習新的東西。 –