2010-09-19 8 views

Antwort

13

Wenn Sie nicht bereit sind, den Inhalt von ROUTINE_DEFINITION in INFORMATION_SCHEMA.ROUTINES zu analysieren, dann ist Ihre beste Wette, die Prozeduren auszuführen und zu lesen die Spalteninformationen aus den zurückgegebenen Datensätzen.

In .NET können Sie dies tun, indem Sie die Ergebnisse der gespeicherten Prozedur in eine DataTable lesen und die Columns-Eigenschaft abfragen.

Der Grund, warum es keine einfache Möglichkeit gibt, dies zu tun, ist, dass eine gespeicherte Prozedur möglicherweise unterschiedliche Ergebnismengen basierend auf den Parametern zurückgeben kann. Es gibt kein festes Resultset-Format, wie es bei benutzerdefinierten Funktionen der Fall ist.

bearbeiten

Wie in der anderen Antwort erwähnt, müssen Sie SET FMTONLY ON verwenden keine Daten, um sicherzustellen, wird zurückgegeben. Es gibt einige Situationen, in denen SET FMTONLY nicht funktioniert, z. Wenn Sie #temp-Tabellen in Ihren gespeicherten Prozeduren verwenden, gibt es eine workaround.

+0

Folgen Sie für SQL2012 dem Rat in diesem Post: http://stackoverflow.com/a/14575114/569662 –

+0

Wenn Microsoft DataTable in .NET Core veraltet hält, funktioniert diese Methode nicht mehr, wenn Sie zu Core wechseln. –

9

Ich habe gerade Profiler ausgeführt, um zu sehen, wie Visual Studio dies für das stark typisierte Dataset Drag & Drop macht.

Dies ist der Code, der gesendet wurde.

SET NO_BROWSETABLE ON; 
SET FMTONLY ON; 

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL 

Also nehme ich an, dass es keinen "offiziellen" Weg geben könnte.

Offensichtlich müssen Sie berücksichtigen, dass eine einzige gespeicherte Prozedur abhängig von den übergebenen Parametern mehrere Ergebnismengen oder unterschiedliche Ergebnismengen zurückgeben kann.

Für Menschen auf 2012+ ein anderer Ansatz könnte sp_describe_first_result_set

1

Mein Weg, dies zu tun verwenden sein: Bearbeiten der gespeicherten Prozedur einer INTO-Klausel zu haben:

ändern

Select * from tablename 

zu

Select * INTO _tablename FROM tablename 

Dies erstellt ein Tabelle in der Datenbank. Verwenden Sie dann SELECT * FROM INFORMATION_SCHEMA WHERE TABLE_NAME = '_tablename'

Vergessen Sie nicht, die Änderung an der Sproc rückgängig zu machen.

Verwandte Themen