Deklarieren Sie die Variable in der Tabellenwertfunktion


Antworten:


205

Es gibt zwei Arten von Tabellenwertfunktionen. Eine, die nur eine select-Anweisung ist und eine, die mehr Zeilen als nur eine select-Anweisung enthalten kann.

Dies kann keine Variable haben:

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

Sie müssen stattdessen Folgendes tun:

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

33
Das erste Beispiel wird als „Inline - Tabellenwertfunktion“ bekannt , die Vorteile Leistung im Vergleich zu einer Multi-Statement - Tabellenwertfunktion, nämlich der Datenbankserver kann recompose die Abfrage mit dem ITVF inlined in die übergeordneten Abfrage, immer im Wesentlichen eines parametrisierte VIEWWährend sich ein MSTVF eher wie eine undurchsichtige gespeicherte Prozedur verhält (allerdings mit seinen eigenen Vorteilen im Vergleich zu Sprocs). Inline-Funktionen sollten MSTVF vorgezogen werden. Wenn Sie Zwischenwerte berechnen und speichern müssen (z. B. das Ergebnis eines komplexen Skalarfunktionsausdrucks), verwenden Sie eine Unterabfrage.
Dai

1
Es ist wahrscheinlich auch erwähnenswert, dass Sie in Betracht ziehen könnten, eine separate Funktion zu schreiben, um das zu generieren, wenn das Ergebnis dessen, was Sie zum Auffüllen der Variablen verwenden, die Sie festlegen möchten, in irgendeiner Weise verallgemeinerbar ist. Auf diese Weise können Sie die oben von @Dai beschriebene ITVF mit allen Vorteilen verwenden und gleichzeitig einen dynamisch generierten Wert in Ihre Funktion einfügen. Ich habe gerade eine Funktion mit Hilfe der obigen Lösung geschrieben (danke @MikaelEriksson!), Die einen ihrer Parameter an eine Hilfsfunktion weitergibt, damit ich das MSTVF-Formular nicht verwenden muss.
Naughtilus

1
Die größten Kosten sind das Einfügen für meine Funktion und ich weiß nicht, wie ich diese Kosten überspringen kann, ohne sie in die Tabellenvariable
einzufügen

@naughtilus es wäre toll, ein Beispiel dafür zu sehen. Haben Sie darüber nachgedacht, zusammen mit Ihrem Vorschlag eine weitere Antwort zu geben?
Jacques
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.