Ich habe schon eine ganze Weile Funktionen und gespeicherte Prozeduren gelernt, aber ich weiß nicht, warum und wann ich eine Funktion oder eine gespeicherte Prozedur verwenden soll. Sie sehen für mich gleich aus, vielleicht weil ich ein bisschen ein Neuling bin.
Kann mir jemand sagen warum?
Antworten:
Funktionen sind berechnete Werte und können keine dauerhaften Umgebungsänderungen an
SQL Server
(dh keineINSERT
oderUPDATE
Anweisungen zulässig) durchführen.Eine Funktion kann in
SQL
Anweisungen inline verwendet werden , wenn sie einen Skalarwert zurückgibt, oder kann verknüpft werden, wenn sie eine Ergebnismenge zurückgibt.Ein erwähnenswerter Punkt aus Kommentaren, die die Antwort zusammenfassen. Vielen Dank an @Sean K Anderson:
Aufrufen der
SQL
Funktion aus der Speicherprozedur und Verwenden einer Funktion anstelle der gespeicherten Prozedur.Hallo Freunde, heute werden wir besprechen, wann die gespeicherte Prozedur verwendet werden soll und wann die Funktion verwendet werden soll. In einem einfachen Team Wenn Sie einige Werte berechnen möchten und ein einzelner Wert zurückgegeben wird, ist dies nicht erforderlich:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
quelle
Der Unterschied zwischen SP und UDF ist unten aufgeführt:
quelle
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
oderSELECT 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:
Wo MyFunction deklariert ist als:
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).
quelle
SELECT * from dbo.MyTableValuedFunction()
. Sprocs hingegen können direkt mit ADO.NET aufgerufen werden, indemSqlCommand.CommandType
auf gesetzt wirdCommandType.StoredProcedure
.Unterschiede zwischen gespeicherten Prozeduren und benutzerdefinierten Funktionen:
RAISEERROR
ODER@@ERROR
sind in UDFs nicht zulässig.GETDATE()
kann nicht in SEF verwendet werden.quelle
GETDATE()
kann in einer Funktion verwendet werden. Der Dreh- und Angelpunkt für nicht deterministisch ist nicht gut.Schreiben Sie eine benutzerdefinierte Funktion, wenn Sie einen Wert zur Verwendung in anderen SQL-Anweisungen berechnen und zurückgeben möchten. Schreiben Sie stattdessen eine gespeicherte Prozedur, um einen möglicherweise komplexen Satz von SQL-Anweisungen zu gruppieren. Immerhin sind dies zwei ziemlich unterschiedliche Anwendungsfälle!
quelle
quelle
Grundlegender Unterschied
Die Funktion muss einen Wert zurückgeben, ist jedoch in der gespeicherten Prozedur optional (die Prozedur kann Null- oder n-Werte zurückgeben).
Funktionen können nur Eingabeparameter haben, während Prozeduren Eingabe- / Ausgabeparameter haben können.
Die Funktion benötigt einen Eingabeparameter. Dies ist obligatorisch, die gespeicherte Prozedur kann jedoch bis zu n Eingabeparameter umfassen.
Funktionen können über die Prozedur aufgerufen werden, während Prozeduren nicht über die Funktion aufgerufen werden können.
Fortschritt Unterschied
Die Prozedur erlaubt sowohl die SELECT- als auch die DML-Anweisung (INSERT / UPDATE / DELETE), während die Funktion nur die SELECT-Anweisung zulässt.
Prozeduren können nicht in einer SELECT-Anweisung verwendet werden, während Function in eine SELECT-Anweisung eingebettet werden kann.
Gespeicherte Prozeduren können in den SQL-Anweisungen nirgendwo im Abschnitt WHERE / HAVING / SELECT verwendet werden, wohingegen Function sein kann.
Funktionen, die Tabellen zurückgeben, können als ein anderes Rowset behandelt werden. Dies kann in JOINs mit anderen Tabellen verwendet werden.
Inline-Funktionen können jedoch als Ansichten verwendet werden, die Parameter annehmen und in JOINs und anderen Rowset-Vorgängen verwendet werden können.
Die Ausnahme kann von einem try-catch-Block in einer Prozedur behandelt werden, während der try-catch-Block in einer Funktion nicht verwendet werden kann.
Wir können Transaktionsmanagement in Prozedur wählen, während wir nicht in Funktion gehen können.
Quelle
quelle
Returns
Schlüsselwort erfolgen und ein Skalar- oder Tabellentyp sein). Gespeicherte Prozeduren können jedoch optional Folgendes zurückgeben: a) 1Int
Ergebniscode über dieReturn
Anweisung eingeben und / oder b) 1+ Parameter (inkl.Cursor
Typ) über dasOutput
Schlüsselwort und / oder c) 1+ Zeilensätze überSelect
Anweisungen. Wenn nur 1 Zeilensatz zurückgegeben wird, kann es als "execute_statement" -Argument einer "Insert Into" -Anweisung verwendet werden.Eine benutzerdefinierte Funktion ist ein wichtiges Tool, das einem SQL Server-Programmierer zur Verfügung steht. Sie können es in einer solchen SQL-Anweisung inline verwenden
Wo
lookupValue
wird eine UDF sein. Diese Art von Funktionalität ist bei Verwendung einer gespeicherten Prozedur nicht möglich. Gleichzeitig können Sie bestimmte Dinge in einer UDF nicht ausführen. Das Grundlegende, an das man sich hier erinnern sollte, ist, dass UDFs:Eine gespeicherte Prozedur kann diese Dinge tun.
Für mich ist die Inline-Verwendung einer UDF die wichtigste Verwendung einer UDF.
quelle
Gespeicherte Prozeduren werden als Skripte verwendet . Sie führen eine Reihe von Befehlen für Sie aus, und Sie können festlegen, dass sie zu bestimmten Zeiten ausgeführt werden. Führt normalerweise mehrere DML-Anweisungen wie INSERT, UPDATE, DELETE usw. oder sogar SELECT aus.
Funktionen werden als Methoden verwendet. Sie übergeben etwas und es gibt ein Ergebnis zurück. Sollte klein und schnell sein - macht es im laufenden Betrieb. Wird normalerweise in einer SELECT-Anweisung verwendet.
quelle
Gespeicherte Prozedur:
EXEC
oderEXECUTE
Anweisung aufgerufen werden .OUT
Parameter verwenden.Funktion:
Kann nur zur Auswahl von Datensätzen verwendet werden. Es kann jedoch sehr einfach aus Standard-SQL heraus aufgerufen werden, z.
oder
Für einfache wiederverwendbare Auswahlvorgänge können Funktionen den Code vereinfachen. Seien Sie vorsichtig, wenn Sie
JOIN
Klauseln in Ihren Funktionen verwenden. Wenn Ihre Funktion eineJOIN
Klausel enthält und Sie sie von einer anderen select-Anweisung aus aufrufen, die mehrere Ergebnisse zurückgibt, werden bei diesem FunktionsaufrufJOIN
diese Tabellen für jede in der Ergebnismenge zurückgegebene Zeile zusammengefasst . Obwohl sie bei der Vereinfachung einiger Logik hilfreich sein können, können sie auch einen Leistungsengpass darstellen, wenn sie nicht ordnungsgemäß verwendet werden.OUT
Parameter zurück.quelle
Benutzerdefinierte Funktion.
Gespeicherte Prozedur
quelle
Um zu entscheiden, wann die folgenden Punkte verwendet werden sollen:
Gespeicherte Prozeduren können keine Tabellenvariable zurückgeben, wenn dies als Funktion möglich ist.
Sie können gespeicherte Prozeduren verwenden, um die Serverumgebungsparameter zu ändern, wenn Sie keine Funktionen verwenden können.
Prost
quelle
SQL Server-Funktionen wie Cursor sollen als letzte Waffe verwendet werden! Sie haben Leistungsprobleme und daher sollte die Verwendung einer Tabellenwertfunktion so weit wie möglich vermieden werden. Wenn Sie von Leistung sprechen, sprechen Sie von einer Tabelle mit mehr als 1.000.000 Datensätzen, die auf einem Server auf einer Hardware der Mittelklasse gehostet werden. Andernfalls müssen Sie sich keine Gedanken über die durch die Funktionen verursachten Leistungseinbußen machen.
Weitere Informationen finden Sie unter: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
quelle
Beginnen Sie mit Funktionen, die einen einzelnen Wert zurückgeben. Das Schöne ist, dass Sie häufig verwendeten Code in eine Funktion einfügen und als Spalte in einer Ergebnismenge zurückgeben können.
Anschließend können Sie eine Funktion für eine parametrisierte Liste von Städten verwenden. dbo.GetCitiesIn ("NY") Gibt eine Tabelle zurück, die als Join verwendet werden kann.
Es ist eine Möglichkeit, Code zu organisieren. Zu wissen, wann etwas wiederverwendbar ist und wann es Zeitverschwendung ist, wird nur durch Versuch und Irrtum und Erfahrung gewonnen.
Auch Funktionen sind in SQL Server eine gute Idee. Sie sind schneller und können sehr mächtig sein. Inline- und Direktauswahl. Achten Sie darauf, nicht zu viel zu verwenden.
quelle
Hier ist ein praktischer Grund, Funktionen gespeicherten Prozeduren vorzuziehen. Wenn Sie eine gespeicherte Prozedur haben, die die Ergebnisse einer anderen gespeicherten Prozedur benötigt, müssen Sie eine insert-exec-Anweisung verwenden. Dies bedeutet, dass Sie eine temporäre Tabelle erstellen und eine
exec
Anweisung verwenden müssen, um die Ergebnisse der gespeicherten Prozedur in die temporäre Tabelle einzufügen. Es ist unordentlich. Ein Problem dabei ist, dass Insert-Execs nicht verschachtelt werden können .Wenn Sie mit gespeicherten Prozeduren nicht weiterkommen, die andere gespeicherte Prozeduren aufrufen, können Sie darauf stoßen. Wenn die verschachtelte gespeicherte Prozedur einfach ein Dataset zurückgibt, kann es durch eine Tabellenwertfunktion ersetzt werden, und dieser Fehler wird nicht mehr angezeigt.
( Dies ist ein weiterer Grund, warum wir die Geschäftslogik aus der Datenbank heraushalten sollten. )
quelle
quelle
Funktionen können in einer select-Anweisung verwendet werden, wenn Prozeduren dies nicht können.
Die gespeicherte Prozedur akzeptiert sowohl Eingabe- als auch Ausgabeparameter, aber Funktionen akzeptiert nur Eingabeparameter.
Funktionen können keine Werte vom Typ Text, ntext, Bild und Zeitstempel zurückgeben, sofern dies möglich ist.
Funktionen können als benutzerdefinierte Datentypen in der Erstellungstabelle verwendet werden, Prozeduren jedoch nicht.
*** ZB: -erstellen
table <tablename>(name varchar(10),salary getsal(name))
Hier ist getal eine benutzerdefinierte Funktion, die einen Gehaltstyp zurückgibt. Wenn eine Tabelle erstellt wird, wird kein Speicher für den Gehaltstyp zugewiesen, und die Funktion getsal wird ebenfalls nicht ausgeführt. Wenn wir jedoch einige Werte aus dieser Tabelle abrufen, werden die Funktion getal ausgeführt und die return Type wird als Ergebnismenge zurückgegeben.
quelle
Mir ist klar, dass dies eine sehr alte Frage ist, aber ich sehe in keiner der Antworten einen entscheidenden Aspekt: Einfügen in den Abfrageplan.
Funktionen können sein ...
Skalar:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
Tabellenwert mit mehreren Anweisungen:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
Inline-Tabellenwert:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
Die dritte Art (Inline-Tabellenwert) wird vom Abfrageoptimierer im Wesentlichen als (parametrisierte) Ansichten behandelt. Dies bedeutet, dass das Verweisen auf die Funktion aus Ihrer Abfrage dem Kopieren und Einfügen des SQL-Körpers der Funktion (ohne tatsächliches Kopieren) ähnlich ist zu folgenden Vorteilen:
Dies kann zu potenziell erheblichen Leistungseinsparungen führen, insbesondere wenn mehrere Funktionsebenen kombiniert werden.
HINWEIS: Es sieht so aus, als würde SQL Server 2019 auch eine Form von Inlining für Skalarfunktionen einführen .
quelle
In SQL Server sind Funktionen und gespeicherte Prozeduren zwei verschiedene Arten von Entitäten.
Funktion: In der SQL Server-Datenbank werden die Funktionen verwendet, um einige Aktionen auszuführen, und die Aktion gibt sofort ein Ergebnis zurück. Es gibt zwei Arten von Funktionen:
System definiert
Benutzerdefinierten
Gespeicherte Prozeduren: In SQL Server werden die gespeicherten Prozeduren auf dem Server gespeichert und können Null-, Einzel- und Mehrfachwerte zurückgeben. Es gibt zwei Arten von gespeicherten Prozeduren:
quelle