有沒有辦法爲SQL Server創建CLR用戶定義函數,該函數返回多個值而不使用表值函數語法?例如,假設我想執行座標轉換,例如:帶有輸出參數的SQL Server CLR UDF - 可能嗎?
[SqlFunction()]
public void ConvertCoordinates(SqlDouble x, SqlDouble y, SqlDouble z, out SqlDouble r, out SqlDouble t, out SqlDouble p)
{
r = new SqlDouble(Math.Sqrt((x.Value*x.Value)+(y.Value*y.Value)+(z.Value*z.Value)));
t = new SqlDouble(Math.Acos(r.Value/z.Value));
p = new SqlDouble(Math.Atan(y.Value/x.Value));
}
這甚至可能嗎?在這種情況下,表值函數看起來不合適,因爲計算永遠不會產生多於一個輸出行。使用標量值函數語法,我將不得不編寫三個不同的函數來執行計算並分別調用每個函數。鑑於我的實際使用情況,這是非常不切實際的。
我意識到上述邏輯可以使用純粹的T-SQL來完成;我的實際用例更復雜,但仍然只會導致單行有多個相互依賴的輸出值。
那麼,底線是可行的嗎?我不認爲這是事實,但人們可以希望。如果偶然的話它是可行的,那麼T-SQL看起來像是什麼調用這樣一個函數?
UDF(無論是標量,表格,T-SQL還是CLR)都不能有參數。如果可以的話,如果你想要使用這些輸出,你必須發明新的語法來允許在'SELECT'子句中調用它。我不明白爲什麼一個返回單行的表值函數對你來說看起來很奇怪。 –
@Damien這只是一個問題,是否可能。我自己的閱讀和實驗表明它可能不是(正如我所說的),但由於我是CLR整合的新手,我想問一下。當超過1行是可能的時,TVF對我來說似乎並不「奇怪」。 ALWAYS示例返回一行,但相關的返回值僅作爲一個集合有意義。在我的實際使用案例中,我正在爲數百萬行執行類似但較大的計算,所以如果出於參數的可能性,TVF似乎效率低下。簡單的「否」就足夠了。 – bporter
@bporter - 顯然TVF將是最好的選擇 - 你自己說,他們「似乎不奇怪,當超過1行是可能的」,然後說你有數百萬行。 Ergo a(S)TVF就是答案!它將比遍歷每一行更有效率,比如強制性的foreach語句。 – gbjbaanb