Angenommen, ich habe eine gespeicherte Prozedur, die mit einigen Änderungen in mehreren Datenbanken dupliziert wird. Und ich möchte auf die Datenbank verweisen, in der die gespeicherte Prozedur gespeichert ist, auch wenn sie in einer anderen Datenbank ausgeführt wird.
Gibt es eine Möglichkeit, den vollständigen Pfad (..) abzurufen oder auf andere Weise die Datenbank abzurufen, in der die gespeicherte Prozedur gespeichert ist, und nicht die aktuelle Datenbank?
sql-server
stored-procedures
Jim Clark
quelle
quelle
Antworten:
Verwenden Sie einfach einteilige oder zweiteilige Namen in der gespeicherten Prozedur, und es wird auf Objekte in der Datenbank verwiesen, die die gespeicherte Prozedur enthalten. Bestimmtes,
Für statisches SQL in einer gespeicherten Prozedur:
Nicht qualifizierte Objektnamen werden relativ zu dem Schema aufgelöst, das die gespeicherte Prozedur enthält.
Zweiteilige Namen werden relativ zur Datenbank aufgelöst, die die gespeicherte Prozedur enthält.
Für dynamisches SQL in einer gespeicherten Prozedur:
Nicht qualifizierte Objektnamen werden relativ zum Standardschema der Benutzeridentität aufgelöst, auf der die gespeicherte Prozedur ausgeführt wird (standardmäßig der Aufrufer).
Zweiteilige Namen werden relativ zur Datenbank aufgelöst, die die gespeicherte Prozedur enthält.
Die Funktion db_name () gibt in beiden Fällen den Namen der Datenbank zurück, die die gespeicherte Prozedur enthält.
quelle
Hier ist ein kurzes Beispiel, das ich zusammengestellt habe und das allgemeine Funktionen zeigt, mit denen Sie sich dem nähern, wonach Sie suchen.
quelle
Zu David Brownes hervorragender Antwort hinzufügen :
Sie haben Glück, denn so funktionieren reguläre / permanente, nicht vom System gespeicherte Prozeduren bereits auf diese Weise, und Sie müssen sich wirklich alle Mühe geben, damit Objekte in der aktuellen Datenbank funktionieren. So funktionieren auch Funktionen. Bei gespeicherten Prozeduren haben Sie nur Optionen - sie als "gespeicherte Systemprozeduren" markieren oder temporär gespeicherte Prozeduren erstellen -, die Sie bei Funktionen / Ansichten / Triggern / etc. nicht haben.
Da sich integrierte Funktionen in temporär gespeicherten Prozeduren geringfügig anders verhalten als statisches SQL, wird im folgenden Beispiel eine nicht temporäre Tabelle verwendet, um sowohl in einer UDF als auch in einer Inline-TVF zu referenzieren. Das folgende Beispiel testet zwar keine temporär gespeicherten Prozeduren, aber der Grund, warum ich die nicht temporäre Tabelle verwendet habe, ist, dass wir sicherstellen müssen, dass ein solches Verhalten hier nicht auftritt, da wir eine Instanz mit unterschiedlichem Verhalten haben. Wenn im folgenden Beispiel einer der Funktionstypen die "aktuelle" Datenbank kennt, würde der Verweis auf die nicht temporäre Tabelle einen Fehler verursachen.
INSTALLIEREN
PRÜFUNG
quelle