it-swarm.com.de

Wie erhält man gespeicherte Prozedur-Parameterdetails?

Wo finde ich Informationen zu gespeicherten Prozedurparametern? In meiner Situation muss ich nur die Eingabeparameter der angegebenen Speicherprozedur kennen.

Im sys.objects gibt es nur allgemeine Details zur Prozedur. In sys.sql_modules kann ich den gesamten SQL-Text einer Prozedur extrahieren.

Als (in SQL Server Management Studio) kann ich bei der Auswahl des Prozedurnamens Informationen zu den Parametern in der Tabellenansicht mit ALT+F1 extrahieren. Ich hoffe, es gibt einen Ort, an dem ich auf diese Weise Details der Eingabeparameter extrahieren kann. 

25
gotqn
select  
   'Parameter_name' = name,  
   'Type'   = type_name(user_type_id),  
   'Length'   = max_length,  
   'Prec'   = case when type_name(system_type_id) = 'uniqueidentifier' 
              then precision  
              else OdbcPrec(system_type_id, max_length, precision) end,  
   'Scale'   = OdbcScale(system_type_id, scale),  
   'Param_order'  = parameter_id,  
   'Collation'   = convert(sysname, 
                   case when system_type_id in (35, 99, 167, 175, 231, 239)  
                   then ServerProperty('collation') end)  

  from sys.parameters where object_id = object_id('MySchema.MyProcedure')
58
Raj
select * from sys.parameters 
inner join sys.procedures on parameters.object_id = procedures.object_id 
inner join sys.types on parameters.system_type_id = types.system_type_id AND parameters.user_type_id = types.user_type_id
where procedures.name = 'sp_name'
5
Ahmad Behjati

Für einen angegebenen Prozedurnamen listet die folgende Abfrage alle Parameter und ihre Reihenfolge sowie ihren Typ auf, ob der Typ nullfähig ist und die Länge des Typs (zur Verwendung mit VARCHAR usw.)

Ersetzen Sie procedure_name durch den Namen Ihrer Prozedur.

DECLARE @ProcedureName VARCHAR(MAX) = 'procedure_name'

SELECT
    pa.parameter_id AS [order]
    , pa.name AS [name]
    , UPPER(t.name) AS [type]
    , t.is_nullable AS [nullable] 
    , t.max_length AS [length] 
FROM 
    sys.parameters AS pa 
    INNER JOIN sys.procedures AS p on pa.object_id = p.object_id 
    INNER JOIN sys.types AS t on pa.system_type_id = t.system_type_id AND pa.user_type_id = t.user_type_id
WHERE 
    p.name = @ProcedureName
ORDER BY 
    t.is_nullable DESC
1

Sie enthält eine Zeile für jeden Parameter eines Objekts, das Parameter akzeptiert. Wenn das Objekt eine Skalarfunktion ist, gibt es auch eine einzige Zeile, die den Rückgabewert beschreibt. Diese Zeile hat einen parameter_id-Wert von 0.

SELECT *  
FROM sys.parameters  
WHERE object_id = object_id('SchemaName.ProcedureName')

Referenz: https://docs.Microsoft.com/de/sql/relational-databases/system-catalog-views/sys-parameters-transact-sql?view=sql-server-2017

1
Santhana

Es gibt die Systemtabellen wie sys.objects oder sys.sysobjects.

Oder Sie können auch INFORMATION_SCHEMA betrachten, insbesondere INFORMATION_SCHEMA.ROUTINES und INFORMATION_SCHEMA.ROUTINE_COLUMNS.

Da es sich im ANSI-Standard INFORMATION_SCHEMA befindet, gibt es weniger SQL Server-spezifische Macken. IMHO ist es für die meisten Dinge einfacher zu verstehen.

1
Paul Draper

Eine Erweiterung von Rajs Antwort oben

;WITH CTE
 AS (SELECT OBJECT_NAME(OBJECT_ID) AS  sql_module_name
           ,CASE
                WHEN OBJECTPROPERTY(OBJECT_ID,'IsProcedure') = 1 THEN 'Stored Procedure'
                WHEN OBJECTPROPERTY(OBJECT_ID,'IsScalarFunction') = 1 THEN 'Scalar Function'
                WHEN OBJECTPROPERTY(OBJECT_ID,'IsTableFunction') = 1 THEN 'Table Function'
            END AS                     sql_module_type
           ,parameter_id AS            parameter_order
           ,name AS                    parameter_name
           ,is_nullable AS             parameter_is_nullable_flag
           ,is_output AS               parameter_is_output_flag
           ,TYPE_NAME(user_type_id) AS parameter_type
           ,max_length AS              parameter_length
           ,CASE
                WHEN TYPE_NAME(system_type_id) = 'uniqueidentifier' THEN precision
                ELSE OdbcPrec
                     (system_type_id,max_length,precision
                     )
            END AS                     parameter_precision
           ,OdbcScale
            (system_type_id,scale
            ) AS                       parameter_scale
     FROM   sys.parameters)
 SELECT DENSE_RANK() OVER(
        ORDER BY sql_module_type
                ,sql_module_name ASC) AS group_id
       ,sql_module_name
       ,sql_module_type
       ,parameter_order
       ,parameter_name
       ,parameter_is_nullable_flag
       ,parameter_is_output_flag
       ,parameter_type
       ,parameter_length
       ,parameter_precision
       ,parameter_scale
 FROM   CTE
 ORDER BY sql_module_type
         ,sql_module_name
         ,parameter_order;
0
AeyJey

Wahrscheinlich ein wenig spät, aber da der Suchbegriff Get parameters for all stored procedure on SQL bei Google diese Seite gelandet hat, werde ich diese Lösung posten (die sich auch in Bezug auf Join von anderen Antworten unterscheidet)

 Select PROCS.name As StoredProcName,TYPE_NAME(user_type_id) As ParameterType,PARAMS.name As Params from sys.procedures PROCS
JOIN sys.parameters PARAMS WITH(NOLOCK) ON PROCS.object_id = PARAMS.object_id
Order by PROCS.object_id
0
Simsons

Informationsschemata sind ISO-Standard-SQL. In der Informationsschemasicht PARAMETER wird eine Liste der Parameter für benutzerdefinierte Funktionen und gespeicherte Prozeduren in der aktuellen oder angegebenen Datenbank angezeigt. Dies ist eine, die ich verwende, um eine Liste aller Parameter für alle Prozeduren zu erhalten:

SELECT          SPECIFIC_NAME,  PARAMETER_MODE, PARAMETER_NAME, DATA_TYPE 
FROM            INFORMATION_SCHEMA.PARAMETERS
ORDER BY        SPECIFIC_NAME
0
Logos Sohl
SELECT *  
FROM INFORMATION_SCHEMA.PARAMETERS 
WHERE SPECIFIC_NAME='proc_name' 
ORDER BY ORDINAL_POSITION 

(getestet mit MSSQL 2014)

0
bertrand gajac

Die folgende Abfrage hat für mich funktioniert:

SELECT * FROM sys.parameters sp1, sys.procedures sp2 WHERE sp1.object_id = sp2.object_id

Für ein genaueres Ergebnis mit der Parameterreihenfolge:

SELECT * FROM sys.parameters sp1, sys.procedures sp2, sys.types st WHERE sp1.object_id = sp2.object_id AND sp2.name = 'usp_nameofstoredprocedure' AND sp1.user_type_id = st.user_type_id ORDER BY sp1.parameter_id asc;
0
Naveen Kumar V