Bestimmen Sie, ob der SP-Parameter in T-SQL einen Standardwert hat

Gibt es eine Möglichkeit, innerhalb von SQL Server zu bestimmen (ich bin auf 2012 FYI), ob die Parameter eines SP Standardwerte haben? Es gibtandere Fäden In diesem Punkt scheinen mir die Vorschläge diese Informationen jedoch nicht genau zu vermitteln.

Hier sind ein paar Dinge, die ich versucht habe;

select *
from sys.objects so join sys.parameters sp on so.object_id = sp.object_id
where so.type='P'
and so.name = 'someSp'

Die obige Abfrage gibt eine Reihe von Spalten zurück, die so klingen, als würde ich den richtigen Baum ankreuzen (has_default_value, default_value darunter)aber Diese scheinen nicht zu variieren, ob ich einen Standardwert in meinem SP habe oder nicht. (has_default ist immer 0, default_value ist immer null)

exec sp_sproc_columns 'someSp'

Gleicher Deal; der obige SP gibt eine Anzahl von Spalten zurück, einschließlich NULLABLE und IS_NULLABLE; NULLABLE ist immer gleich 1 und IS_NULLABLE = YES, unabhängig von meinem SP-Inhalt.

Eine Notiz; SQL Server Management Studio zeigt die mit jedem SP-Parameter verknüpften Metadaten deutlich an.

Ich habe SQL Profiler verwendet, um zu untersuchen, was passiert, wenn ich die Parameter eines SP im Objekt-Explorer von Management Studio anzeige. Wenn Sie den Parameterordner erweitern, werden zwei Abfragen ausgeführt. Die erste Abfrage ist etwas lang, um sie hier einzufügen (obwohl ich dies tun werde, wenn es hilfreich ist). Es enthält eine Spalte namens DEFAULT VALUE. Es ist jedoch immer NULL, soweit ich das beurteilen kann. Die zweite Abfrage gibt einfach den Hauptteil des SP zurück. vermutlich für die Ausgabe in das Texteditor-Fenster (obwohl ich befürchte, dass in mgmt studio ein Parsing stattfinden könnte!)

Als Referenz / nur um sicherzugehen, dass ich meine Murmeln nicht verliere, habe ich zwei sinnlose Sps nur zum Testen erstellt. Sie sehen aus wie:

CREATE PROCEDURE TestDefaultSpValue_Default
@I          INT  = 2
AS
BEGIN
SET NOCOUNT ON;
SELECT @I
END

CREATE PROCEDURE TestDefaultSpValue_NoDefault
@I          INT
AS
BEGIN
SET NOCOUNT ON;
SELECT @I
END

Antworten auf die Frage(3)

Ihre Antwort auf die Frage