web-dev-qa-db-fra.com

Comment obtenir les détails des paramètres de procédure stockée?

Où puis-je trouver des informations sur les paramètres de procédure stockée? Dans ma situation, je n'ai besoin de connaître que les paramètres d'entrée d'une procédure de stockage donnée.

Dans le sys.objects, il n'y a que des détails communs sur la procédure. Dans sys.sql_modules, je peux extraire le texte SQL complet d'une procédure.

En tant que (dans SQL Server Management Studio), je peux extraire des informations sur les paramètres dans la vue tabulaire en utilisant ALT+F1 lors de la sélection du nom de la procédure. J'espère qu'il y a un endroit où je peux extraire les détails des paramètres d'entrée de cette manière. 

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

Pour un nom de procédure fourni, la requête suivante répertorie tous ses paramètres et leur ordre avec leur type, si le type est nullable et sa longueur (pour une utilisation avec VARCHAR, etc.)

Remplacez procedure_name par le nom de votre procédure.

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

Il contient une ligne pour chaque paramètre d'un objet qui accepte des paramètres. Si l'objet est une fonction scalaire, il existe également une seule ligne décrivant la valeur de retour. Cette ligne aura une valeur parameter_id de 0.

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

Référence: https://docs.Microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-parameters-transact-sql?view=sql-server-2017

1
Santhana

Il y a les tables système, comme sys.objects ou sys.sysobjects.

Vous pouvez également consulter INFORMATION_SCHEMA, en particulier INFORMATION_SCHEMA.ROUTINES et INFORMATION_SCHEMA.ROUTINE_COLUMNS.

Comme il est dans le INFORMATION_SCHEMA ANSI-standard, il y a moins de bizarreries spécifiques à SQL Server. À mon humble avis, il est plus facile à comprendre pour la plupart des choses.

1
Paul Draper

Probablement un peu tard, mais puisque le terme de recherche Get parameters for all stored procedure on SQL sur google m'a atterri cette page, je vais poster cette solution (qui est aussi un peu différente des autres réponses en termes de participation).

 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
SELECT *  
FROM INFORMATION_SCHEMA.PARAMETERS 
WHERE SPECIFIC_NAME='proc_name' 
ORDER BY ORDINAL_POSITION 

(testé avec MSSQL 2014)

0
bertrand gajac

La requête suivante a fonctionné pour moi:

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

Pour un résultat plus spécifique avec l'ordre des paramètres:

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