web-dev-qa-db-ja.com

ストアドプロシージャのパラメーターの詳細を取得する方法

ストアドプロシージャのパラメーターに関する情報はどこで入手できますか?私の状況では、特定のストアプロシージャの入力パラメータのみを知る必要があります。

の中に sys.objectsプロシージャに関する一般的な詳細のみがあります。 sys.sql_modulesプロシージャのSQLテキスト全体を抽出できます。

As(SQL Server Management studio)では、ALT+F1プロシージャ名を選択するとき。そのようにして入力パラメータの詳細を抽出できる場所があることを願っています。

28
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')
63
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'
6
Ahmad Behjati

指定されたプロシージャ名の場合、次のクエリは、すべてのパラメータとその順序を、そのタイプとタイプの長さとともにリストします(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
1

パラメータを受け入れるオブジェクトの各パラメータの行が含まれます。オブジェクトがスカラー関数の場合、戻り値を記述する単一の行もあります。その行の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

1
Santhana

次のクエリは私のために働いた:

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;
1
Naveen Kumar V

sys.objectssys.sysobjectsなどのシステムテーブルがあります。

または、INFORMATION_SCHEMA、特にINFORMATION_SCHEMA.ROUTINESおよびINFORMATION_SCHEMA.ROUTINE_COLUMNSも確認できます。

ANSI標準INFORMATION_SCHEMAに含まれているため、SQL Server固有の癖が少なくなります。私見では、ほとんどのことを理解しやすいです。

1
Paul Draper

上記のRajの答えの拡張

;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

おそらく少し遅れますが、検索語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
0
Simsons

情報スキーマはISO標準のSQLです。 PARAMETERS情報スキーマビューには、現在のデータベースまたは指定されたデータベースのユーザー定義関数およびストアドプロシージャのパラメーターの一覧が表示されます。これは、すべての手順のすべてのパラメーターのリストを取得するために使用するものです。

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 

(MSSQL 2014でテスト済み)

0
bertrand gajac