2011-07-12 152 views
74

如何在表值函數中聲明變量?在表值函數中聲明變量

+0

內聯或多語句?像* MSDN *描述他們? – gbn

+9

@YogeshBhadauirya荒謬的「使用搜索引擎」響應的問題是* this *是搜索引擎指向的地方。一種無限的遞歸情況。最好刪除頁面或僅回答問題。 – Volvox

+24

這個問題值得更多的愛:重新開放,接受下面的答案。它實際上*是一個真正的問題。 – Askolein

回答

136

有兩種風格的表值函數。一個只是一個select語句,一個可以有更多的行而不僅僅是一個select語句。

這不能有一個變量:

create function Func() returns table 
as 
return 
select 10 as ColName 

你要做這樣的代替:

create function Func() 
returns @T table(ColName int) 
as 
begin 
    declare @Var int 
    set @Var = 10 
    insert into @T(ColName) values (@Var) 
    return 
end 
+1

謝謝,這非常有用 –

+13

第一個例子被稱爲「內聯表值函數」,與多語句表值函數相比,它具有性能優勢,即數據庫服務器可以*用ITVF重新*查詢*內聯*到父查詢中,實質上成爲一個參數化的'VIEW',而MSTVF則更像一個不透明的存儲過程(雖然與sprocs相比有其自身的優勢)。內聯函數應該優於MSTVF。如果您確實需要計算並存儲中間值(例如複雜標量函數表達式的結果),則使用子查詢。 – Dai

+0

也許值得一提的是,如果你用來填充你想要設置的變量的結果在任何方面都是可以通用的,那麼你可以考慮編寫一個單獨的函數來生成它。 這將允許您使用上述@Dai所描述的ITVF及其所有優點,同時仍將動態生成的值插入到函數中。我只是在上述解決方案的幫助下編寫了一個函數(謝謝@MikaelEriksson!),它將其參數之一傳遞給一個輔助函數,以免我必須使用MSTVF表單。 – naughtilus