Skalarwertfunktionen können aufgerufen werden, wenn skalare Ausdrücke verwendet werden. Dies umfasst berechnete Spalten und CHECK-Einschränkungsdefinitionen. Skalarwertfunktionen können auch mit der EXECUTE-Anweisung ausgeführt werden. Skalarwertige Funktionen müssen unter Verwendung mindestens des zweiteiligen Namens der Funktion aufgerufen werden .
Dies ist also im Grunde eine Einschränkung, die vom SQL Server-Entwicklungsteam festgelegt wurde, und ich halte sie für ganz richtig. Selbst wenn es irgendwie erlaubt ist (nur aus Gründen der Konversation), würde ich immer noch das Schema-Präfix verwenden.
Ich unterstütze immer die Verwendung des Schemanamens, auch wenn es ohne Hinzufügen funktionieren würde. Dies ist eine bewährte Methode, die von allen "guten" Entwicklern verwendet wird, unabhängig davon, wie redundant sie ist.
Der andere Grund, den ich sehe, ist, dass die Datenbank-Engine etwas benötigt, um zwischen Systemfunktionen wie getdate ()und benutzerdefinierten Funktionen zu unterscheiden. Wenn Sie eine Funktion ohne Schemanamen aufrufen dürfen, wie würde das Datenbankmodul zwischen der vom Benutzer erstellten Funktion Getdate und der Systemfunktion GETDATE () unterscheiden?
Warum ist es dann anders mit SPs? Wie Sie sagten, kann es sein, Kollisionen zu vermeiden. Ich habe gerade einen SP "create procedure sp_help as select getdate ()" in meiner Benutzerdatenbank erstellt. Wenn ich mit oder ohne Schema (dbo) ausführe, verweist SQL Server auf System SP. Warum wird mein von mir erstellter SP nicht ausgeführt?
Rajesh Ranjan
1
@rajeshRajan Da Sie sp_procname haben (Sie haben Ihrer Prozedur SP vorangestellt), wird SQL Server gezwungen, zuerst in der Master-Datenbank nach dem kompilierten Plan zu suchen, und da dieser Prozess in der Master-Datenbank vorhanden ist, wird er nicht ausgeführt, wenn der Prozess nicht gefunden wurde im Master hätte es dann deine ausgeführt. Sie sollten proc niemals mit dem Präfix sp_ erstellen, da es Leistungsprobleme gibt.
Shanky
Ich denke, Shanky hat die "Warum" -Frage direkt beantwortet, als er erwähnte, dass sie vom SQL Server-Entwicklungsteam festgelegt wurde. Sie könnten fragen, warum sie dies getan haben und warum das Verhalten von Funktionen nicht mit Prozeduren übereinstimmt, aber die Antwort spielt wahrscheinlich keine große Rolle.
Michael J Swart
1
Übrigens können die Auswirkungen von Prozeduren, die mit "sp_" beginnen, nicht auf die Leistung gemessen werden. Es ist seit Jahren kein Thema mehr. Das sp-Präfix ist möglicherweise immer noch keine gute Idee, aber die Leistung ist nicht der Grund.
Michael J Swart
10
Die andere Antwort erklärt, dass dies eine Einschränkung ist, aber nicht der Grund dafür.
Die Anforderung ist nicht immer wahr. Skalare UDFs können verwendet werden EXECund verwenden weiterhin eine implizite Auflösung ( Beispiel ).
Ich stelle mir das vor, um Kollisionen zu vermeiden.
Wenn Funktionen ohne Schema referenziert werden könnten, würde jemand, der seine eigene Funktion erstellt hat, die zufällig crypt_gen_randomin den Jahren 2000 oder 2005 aufgerufen wurde, Probleme beim Upgrade auf eine spätere Version haben, da dies 2008 der Name einer integrierten Funktion wurde.
Es gibt keine Unklarheiten bei der execVerwendung, da integrierte Funktionen nicht so aufgerufen werden können.
Warum ist es dann anders mit SPs? Wie Sie sagten, kann es sein, Kollisionen zu vermeiden. Ich habe gerade einen SP "create procedure sp_help as select getdate ()" in meiner Benutzerdatenbank erstellt. Wenn ich mit oder ohne Schema (dbo) ausführe, verweist SQL Server auf System SP. Warum wird mein von mir erstellter SP nicht ausgeführt?
Rajesh Ranjan
3
@ Rajesh. Objekte, die mit sp_ beginnen, werden speziell in der Master- / Ressourcendatenbank gespeichert. Und es ist dokumentiert, dass dieses Präfix vermieden werden sollte. Es gibt keine solche Konvention für eingebaute Funktionen.
Die andere Antwort erklärt, dass dies eine Einschränkung ist, aber nicht der Grund dafür.
Die Anforderung ist nicht immer wahr. Skalare UDFs können verwendet werden
EXEC
und verwenden weiterhin eine implizite Auflösung ( Beispiel ).Ich stelle mir das vor, um Kollisionen zu vermeiden.
Wenn Funktionen ohne Schema referenziert werden könnten, würde jemand, der seine eigene Funktion erstellt hat, die zufällig
crypt_gen_random
in den Jahren 2000 oder 2005 aufgerufen wurde, Probleme beim Upgrade auf eine spätere Version haben, da dies 2008 der Name einer integrierten Funktion wurde.Es gibt keine Unklarheiten bei der
exec
Verwendung, da integrierte Funktionen nicht so aufgerufen werden können.quelle