Zadeklaruj zmienną w funkcji wycenianej w tabeli

111

Jak mogę zadeklarować zmienną w funkcji wycenianej w tabeli? (jak w moim tytule)

esquare
źródło
inline czy multi-statement? Jak opisuje je MSDN ?
gbn

Odpowiedzi:

207

Istnieją dwa rodzaje funkcji o wartościach tabelarycznych. Taką, która jest tylko instrukcją select i taką, która może mieć więcej wierszy niż tylko instrukcja select.

To nie może mieć zmiennej:

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

Zamiast tego musisz zrobić tak:

create function Func()
returns @T table(ColName int)
as
begin
  declare @Var int
  set @Var = 10
  insert into @T(ColName) values (@Var)
  return
end
Mikael Eriksson
źródło
34
Pierwszym przykładem jest znany jako „Inline wycenione tabela funkcja”, który ma wzrost wydajności w porównaniu do Multi-oświadczenie wycenione tabela funkcji, mianowicie serwer bazy danych może recompose zapytania z ITVF inlined do zapytania dominującej w istocie staje się parametryzowane VIEWpodczas gdy MSTVF zachowuje się bardziej jak nieprzejrzysta procedura składowana (choć ma swoje zalety w porównaniu do sprocs). Funkcje wbudowane powinny być preferowane zamiast MSTVF. Jeśli musisz obliczyć i zapisać wartości pośrednie (takie jak wynik złożonego wyrażenia funkcji skalarnej), użyj podzapytania.
Dai,
1
Prawdopodobnie warto również wspomnieć, że jeśli wynik tego, czego używasz do wypełnienia zmiennej, którą chcesz ustawić, jest w jakikolwiek sposób uogólniany, możesz rozważyć napisanie oddzielnej funkcji, aby ją wygenerować. Pozwoliłoby to na użycie ITVF opisanego powyżej przez @Dai, ze wszystkimi jego zaletami, przy jednoczesnym wstawieniu dynamicznie generowanej wartości do funkcji. Właśnie napisałem funkcję za pomocą powyższego rozwiązania (dziękuję @MikaelEriksson!), Która przekazuje jeden ze swoich parametrów do funkcji pomocniczej, aby zaoszczędzić mi konieczności korzystania z formularza MSTVF.
naughtilus
1
największy koszt to wstawienie mojej funkcji i nie wiem jak pominąć ten koszt bez wstawiania do tabeli zmiennej i zwracania wyniku wyboru
uzay95
@naughtilus byłoby wspaniale zobaczyć taki przykład. Czy rozważałeś udzielenie innej odpowiedzi wraz ze swoją sugestią?
Jacques