Funktionen und gespeicherte Prozeduren dienen getrennten Zwecken. Obwohl dies nicht die beste Analogie ist, können Funktionen buchstäblich als jede andere Funktion angesehen werden, die Sie in einer beliebigen Programmiersprache verwenden würden. Gespeicherte Prozesse ähneln jedoch eher einzelnen Programmen oder einem Batch-Skript.
Funktionen haben normalerweise einen Ausgang und optional Eingänge. Die Ausgabe kann dann als Eingabe für eine andere Funktion (ein integrierter SQL Server wie DATEDIFF, LEN usw.) oder als Prädikat für eine SQL-Abfrage verwendet werden - z . B. SELECT a, b, dbo.MyFunction(c) FROM table
oder SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.
Gespeicherte Prozesse werden verwendet, um SQL-Abfragen in einer Transaktion zusammenzubinden und eine Schnittstelle zur Außenwelt herzustellen. Frameworks wie ADO.NET usw. können eine Funktion nicht direkt aufrufen, aber sie können einen gespeicherten Prozess direkt aufrufen.
Funktionen bergen jedoch eine versteckte Gefahr: Sie können missbraucht werden und ziemlich unangenehme Leistungsprobleme verursachen: Betrachten Sie diese Abfrage:
SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)
Wo MyFunction deklariert ist als:
CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
DECLARE @retval INTEGER
SELECT localValue
FROM dbo.localToNationalMapTable
WHERE nationalValue = @someValue
RETURN @retval
END
Was hier passiert ist, dass die Funktion MyFunction für jede Zeile in der Tabelle MyTable aufgerufen wird. Wenn MyTable 1000 Zeilen enthält, sind dies weitere 1000 Ad-hoc-Abfragen für die Datenbank. Wenn die Funktion aufgerufen wird, wenn sie in der Spaltenspezifikation angegeben ist, wird die Funktion für jede von SELECT zurückgegebene Zeile aufgerufen.
Sie müssen also vorsichtig mit den Schreibfunktionen umgehen. Wenn Sie SELECT aus einer Tabelle in einer Funktion ausführen, müssen Sie sich fragen, ob dies mit einem JOIN im übergeordneten gespeicherten Prozess oder einem anderen SQL-Konstrukt (z. B. CASE ... WHEN ... ELSE ...) besser ausgeführt werden kann. ENDE).