Gespeicherter Prozedurbereich: Verwenden von sp aus einer anderen database

Ich hava eine gespeicherte Prozedur namens PROC_fetchTableInfo (einfache Auswahl aus sys.tables) in einer database namens

Cust 

Ich möchte diese Prozedur in einer anderen database namens verwenden

 Dept 

Ich habe versucht, diese Sp in dieser database mit Befehl auszuführen

 EXECUTE Cust.dbo.PROC_fetchTableInfo 

aber als Ergebnis bekomme ich Tabellen aus der database Cust. Wie bekomme ich dieses Verfahren in der database Dept?

Eine gespeicherte Prozedur ist an die objecte in ihrem Code gebunden. Wenn Cust.dbo.PROC_fetchTable auf eine Tabelle T verweist, ist das strikt die Tabelle T im Schema dbo in der database Cust . Sie können das Verfahren von jedem anderen Ort aus aufrufen, es wird immer auf diese Tabelle verweisen.

Wenn Sie das gleiche Verfahren in einer anderen Tabelle auf einer anderen database ausführen müssen, dann ist die beste Lösung bei weitem ein neues Verfahren: Dept.dbo.PROC_fetxTableInfo . Das ist besser als die Alternative zur Verwendung von Dynamic-SQL . Während dies aus einer TROCKEN- und Code-Wiederverwendungsperspektive kontraintuitiv erscheint, ist T-SQL eine datazugriffssprache, die keine Programmiersprache ist, lassen Sie Ihren C / C # Geist an der Tür, wenn Sie die database eingeben. Nur eine andere Prozedur in der Dept database haben.

Ihre Prozedur, Cust.dbo.PROC_fetchTableInfo betrachtet data in der Cust database. Klingt wie man eine Kopie davon in der Dept database benötigt.

Alternativ (und ganz unbefriedigend für mich) können Sie einen Parameter hinzufügen, der steuert, welche database abzufragen ist, indem Sie die Abfrage im Sproc dynamisch erstellen.

Vielleicht könntest du es in einer "Common" -database erstellen und es wie EXEC Common..PROC_fetchTableInfo @databaseName='Dept' "Common" nennen. EXEC Common..PROC_fetchTableInfo @databaseName='Dept'

Dies ist möglich (wenn Sie versuchen, eine Utility-function zu schreiben, die Sie über alle databaseen verwenden können). Sie können es in der Master-database erstellen, geben Sie ihm ein sp_ Präfix und markieren Sie es als sp_ .

 use master go CREATE PROCEDURE dbo.sp_sys_tables_select AS SELECT * FROM sys.tables GO EXEC sys.sp_MS_marksystemobject 'dbo.sp_sys_tables_select' GO EXEC tempdb.dbo.sp_sys_tables_select EXEC msdb.dbo.sp_sys_tables_select