2016-02-03 99 views
0

我習慣於在MSSQL 2008 R2中使用公用表表達式(CTE)。我知道語法在他們可以出現的位置有點煩瑣,而在普通的T-SQL中,在with表達式之前需要一個明確的分號(或者開始一個新的批處理)。我想在用戶定義的函數中使用CTE。對於簡單的情況下,這個工程:表值函數中的公用表表達式(CTE)

create function dbo.udf_test() 
returns table 
with schemabinding 
as 
return (
    with foo as (
    select 5 as f 
) 
    select f 
    from foo 
) 

但現在我想使我的功能udf_test更復雜一點。例如在函數體內聲明一個變量。首先我需要明確的beginend,因爲函數體將不再是單個語句。所以我儘量從而創建一個:

create function dbo.udf_test() 
returns table 
with schemabinding 
as 
begin 
    return (
    with foo as (
     select 5 as f 
    ) 
    select f 
    from foo 
) 
end 

然而,這給出了錯誤

Incorrect syntax near the keyword 'with'. 

我如何使用CTE在我的表值函數,如果它比單return聲明更復雜?

+1

如果向內聯表值函數添加多於1條語句,它將不再是內聯表值函數。它將成爲一個多語句表值函數。因此,表現會令人恐慌。通常這些比標量函數更糟糕。順便說一句,你不需要像這樣在括號中包括你的回報。 –

+0

感謝您的提示。在這種特殊情況下,函數不會嵌入到任何更大的查詢中,而是直接調用並將結果直接插入到另一個表中。所以我不關心優化器是否可以通過內聯來「看透」函數定義。儘管如此,我仍會密切關注減速。 –

回答

3
CREATE FUNCTION dbo.udf_test() 
RETURNS 
@return TABLE 
(
    f int NOT NULL 
) 
AS 
BEGIN 

    WITH foo AS (
     SELECT 5 AS f 
    ) 
    INSERT INTO @return 
    SELECT f 
    FROM foo; 

    RETURN; 
END