Ich habe Hunderte von SPs und möchte herausfinden:
- Eingabeparameter mit Typ
- Ausgabefelder mit Typ (keine Ausgabeparameter)
Natürlich könnte ich jedes manuell durchgehen und es aufschreiben, aber wo ist der Spaß daran ... Nein, buchstäblich, wo ist der Spaß daran :)
Kann dies durchgeführt werden oder verfügt SQL Management Studio 2008 R2 bereits über diese Funktion?
Ich weiß nicht einmal, wo ich anfangen soll, daher ist jede Antwort akzeptabel.
Bearbeiten zur Verbesserung der Frage: Wenn wir es als zwei verschiedene Aufgaben betrachten, könnten wir dies einfacher erreichen. Auch mit Reflexion auf der Client-Seite. (Eine schnelle und schmutzige Konsolen-App würde ausreichen.)
sql-server-2008-r2
stored-procedures
parameter
Michael Wells
quelle
quelle
SET FMTONLY ON;
die gespeicherte Prozedur aus und führt sie aus . SQL Server 2012 verfügt über einige zusätzliche Funktionen, die hier hilfreich sind.output
Schlüsselwort verziert sind, das im proc zugewiesen werden kann, und dem Wert, der vom Aufrufer der gespeicherten Prozedur abgerufen wird. Nützlich, wenn Sie Skalarwerte anstelle von Datenzeilen zurückgeben möchten. Sie sind tatsächlich Eingabe- / Ausgabeparameter, da sie auch zum Übergeben von Werten an die Prozedur verwendet werden können.Antworten:
Sie sollten dies in der Systemansicht INFORMATION_SCHEMA.PARAMETERS tun können . Sie haben dort, was Sie brauchen.
"Es wird eine Zeile für jeden Parameter einer benutzerdefinierten Funktion oder gespeicherten Prozedur zurückgegeben, auf die der aktuelle Benutzer in der aktuellen Datenbank zugreifen kann. Für Funktionen gibt diese Ansicht auch eine Zeile mit Rückgabewertinformationen zurück."
PS: Wenn die Antwort auf Martins Frage "Spalten in der Ergebnismenge" lautet, ignorieren Sie meine Antwort. Dies gilt nur für die Parameter der Prozeduren, nicht für ein Ergebnis.
quelle
Für Ein- und Ausgangsparameter können Sie sehen
sys.parameters
,sys.procedures
undsys.types
. Hier ist eine Prozedur mit verschiedenen Eingabe- / Ausgabeparametern, Alias-Typen und sogar einem TVP (nur 2008+):Und hier ist eine Abfrage, um diese Informationen abzurufen
sys.parameters
,sys.procedures
undsys.types
:Ergebnisse:
Offensichtlich müssen Sie einige Massagen durchführen, damit diese Werte wie echte Datentypen aussehen. Schneiden Sie beispielsweise die max_length eines nvarchar in zwei Hälften, es sei denn, es ist -1. In diesem Fall muss es ausgetauscht werden
MAX
. Fügen Sie für Dezimalzahlen, Zahlen usw. die Genauigkeit und Skalierung entsprechend hinzu. Wenn Sie TVPs verwenden, möchten Sie wahrscheinlich das SchemaSCHEMA_NAME
für diese Typen abrufen. Usw. usw.Leider gibt es keine andere Möglichkeit als Brute-Force-Analyse des Prozedurkörpers (und selbst das ist ohne ernsthafte Ninja-RegEx-Kenntnisse nicht trivial), um festzustellen, ob der Parameter nullwertfähig ist oder ob er einen Standardwert hat und wie der Standardwert lautet. Diese Informationen werden einfach nicht in den Metadaten gespeichert - während sie vorhanden sind
has_default_value
unddefault_value
Spalten enthaltensys.parameters
, sind sieNULL
für CLR-Prozeduren immer nur ungleich oder ungleich Null. Ich habe mich seit 2006 darüber beschwert, aber wir haben noch keine Fortschritte in diesem Bereich zu sehen (obwohl ich eine Problemumgehung für dieses Connect-Element veröffentlicht habe, die ich hier nicht reproduzieren werde, da einige unangemessene Annahmen über den Codierungsstil Ihrer gespeicherten Prozeduren getroffen werden). Und es gibt überhaupt nichts, was Hoffnung gibt, festzustellen, ob der Parameter optional ist (z . B.@c
und@g
höher).Bei den Ergebnismengen hat Martin völlig Recht - es gibt keine zuverlässige Methode, um herauszufinden, woraus ein Ergebnis bestehen wird, außer die Verwendung
SET FMTONLY ON
. Es gibt einige eigenartige Fehler bei diesem, also würde ich mich davon fernhalten. Eine beliebte Flickschusterei ist die VerwendungOPENQUERY
mit einem „Loopback“ verknüpften Server , wählen Sie die Ergebnisse in eine #temp Tabelle, aber das funktioniert nur , wenn die Prozedur genau ein resultset hat. Ein gutes Beispiel findet sich in einer der vorherigen Antworten von Martin:Was ist der einfachste Weg, um eine temporäre Tabelle in SQL Server zu erstellen, die das Ergebnis einer gespeicherten Prozedur enthalten kann?
Sobald Sie die Ausgabe in die Tabelle #temp eingefügt haben, können Sie Folgendes ausführen:
Dies gibt unter anderem eine Liste von Spaltennamen und deren Datentypen aus. Während dies für Hunderte von gespeicherten Prozeduren ein langwieriger Prozess sein wird, habe ich Ideen zur Automatisierung. Wenn dies für Sie eine interessante Lösung ist, lassen Sie es mich bitte wissen und ich kann meine Antwort erweitern.
Martin auch neue Funktionen in SQL Server 2012 angedeutet , dass dies ein machen wird viel einfacher (aber es ist immer noch auf den ersten resultset einer gespeicherten Prozedur begrenzt). Weitere Details dazu finden Sie in meiner Antwort auf dieselbe Frage oben.
Für Rückgabewerte kenne ich keine Möglichkeit, diese aus den Metadaten abzurufen.
quelle
SELECT
Abfrage oben? Haben Sie es ausgeführt (nur den Namen der zu suchenden Prozedur geändert)? Es handelt sich um eine einzelne Ergebnismenge, die eine Zeile für pro Parameter enthält (sie wird nur dann zu einer "Datentabelle", wenn Sie sie in .NET verwenden und so gestalten).