Gibt es einen Weg über Metadaten (Information_Schema, vielleicht?), Um eine Liste der Spalten zu erhalten, die ein Sproc zurückgibt? Ich versuche, einige Codegenerierung zu automatisieren, und das würde enorm helfen ...Abrufen von Spaltennamen/Typen, die von einer gespeicherten Prozedur zurückgegeben werden
Antwort
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.
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
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.
Folgen Sie für SQL2012 dem Rat in diesem Post: http://stackoverflow.com/a/14575114/569662 –
Wenn Microsoft DataTable in .NET Core veraltet hält, funktioniert diese Methode nicht mehr, wenn Sie zu Core wechseln. –