Как получить параметры параметров хранимой процедуры?

Где я могу найти информацию о параметрах хранимой процедуры? В моей ситуации мне нужно знать только входные параметры данной процедуры хранения.

В sys.objects есть только общие сведения о процедуре. В sys.sql_modules я могу извлечь весь текст SQL процедуры.

Поскольку (в студии SQL Server Management) я могу извлечь информацию о параметрах в табличном виде, используя ALT+F1 при выборе имени процедуры. Я надеюсь, что есть место, из которого я могу извлечь данные параметров ввода таким образом.

Ответы

Ответ 1

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')

Ответ 2

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'

Ответ 3

Существуют системные таблицы, такие как sys.objects или sys.sysobjects.

Или вы также можете посмотреть INFORMATION_SCHEMA, в частности INFORMATION_SCHEMA.ROUTINES и INFORMATION_SCHEMA.ROUTINE_COLUMNS.

Поскольку он находится в стандарте ANSI INFORMATION_SCHEMA, существует меньше специфических особенностей SQL Server. ИМХО легче понять для большинства вещей.

Ответ 4

Для предоставленного имени процедуры следующий запрос перечисляет все ее параметры и их порядок, а также их тип и длину типа (для использования с VARCHAR и т.д.)

Замените procedure_name названием вашей процедуры.

DECLARE @ProcedureName VARCHAR(MAX) = 'procedure_name'

SELECT
    pa.parameter_id AS [order]
    , pa.name AS [name]
    , UPPER(t.name) AS [type]
    , 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

Ответ 5

Следующий запрос работал для меня:

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

Для более конкретного результата с порядком параметра:

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;

Ответ 6

Он содержит строку для каждого параметра объекта, который принимает параметры. Если объект является скалярной функцией, существует также одна строка, описывающая возвращаемое значение. Эта строка будет иметь значение parameter_id 0.

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

Ссылка: https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-parameters-transact-sql?view=sql-server-2017

Ответ 7

SELECT *  
FROM INFORMATION_SCHEMA.PARAMETERS 
WHERE SPECIFIC_NAME='proc_name' 
ORDER BY ORDINAL_POSITION 

(тестируется с MSSQL 2014)

Ответ 8

Вероятно, немного поздно, но поскольку поисковый термин " Get parameters for all stored procedure on SQL в Google", приземлился на эту страницу, я опубликую это решение (которое также отличается от других ответов в терминах объединения)

 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

Ответ 9

Расширение ответа Радж выше

;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;

Ответ 10

Информационные схемы являются стандартом ISO по SQL. Представление информационной схемы PARAMETERS отображает список параметров для пользовательских функций и хранимых процедур в текущей или указанной базе данных. Это тот, который я использую, чтобы получить список всех параметров для всех процедур:

SELECT          SPECIFIC_NAME,  PARAMETER_MODE, PARAMETER_NAME, DATA_TYPE 
FROM            INFORMATION_SCHEMA.PARAMETERS
ORDER BY        SPECIFIC_NAME

Ответ 11

select t1.[name] as [SP_name],t2.[name] as [Parameter_name],
t3.[name] as [Type],t2.[Length],t2.colorder as [Param_order]
from sysobjects t1
inner join syscolumns t2 on t1.[id]=t2.[id]
inner join systypes t3 on t2.xtype=t3.xtype
where t1.[name]='My_StoredProc_Name'
order by [Param_order]