web-dev-qa-db-ja.com

ストアドプロシージャの結果の列タイプの取得

ストアドプロシージャが返すものを、列名とその型とともに取得しようとしています。テーブルでこれを行うことはできますが、ストアドプロシージャについては理解できませんでした。 sp_columnsが、テーブルでのみ機能するようにすることができました。

私もこのようなことを試しましたが、何に何を一致させるべきかわかりません。

SELECT * 
FROM SYS.PROCEDURES (NOLOCK) AS AA
INNER JOIN SYS.SCHEMAS (NOLOCK) AS BB ON (AA.schema_id = BB.schema_id)
INNER JOIN SYS.COLUMNS (NOLOCK) AS CC ON (AA.object_id = CC.object_id)

例えば:

USER_ID VARCHAR(200)

ストアドプロシージャが返す列の名前とそのデータ型のみが必要です。問題がある場合、SQL Serverのバージョンは2014です。

何か案は?ありがとう。

8
Mein Hat

特にオブジェクトの場合は、SQL Serverが何をすべきかを理解できる場合(たとえば、動的SQLが有効な結果を返さない場合)の最初の結果セットを記述する sys.dm_exec_describe_first_result_set_for_object というDMVがあります。 。

特にT-SQLまたはバッチ関連のアイテムの場合、別のDMVとそれに付随するシステムストアドプロシージャがあります。 DMVは sys.dm_exec_describe_first_result_set であり、dmvに対応するストアドプロシージャは sp_describe_first_result_set です。

13
Sean Gallardy

新しいシステムストアドプロシージャsp_describe_first_result_setを使用できるはずです- 詳細については、MSDNドキュメントを参照してください

EXEC sp_describe_first_result_set N'YourStoredProcedureNameHere'
11
marc_s

Openqueryを使用してストアドプロシージャの結果を一時テーブルに挿入する場合、一時テーブルの列をクエリできます。

Openqueryでは@variableを使用できないため、動的SQLとexecを介して実行する必要があることに注意してください。これの問題は、一時テーブルが動的クエリの外部に存在しないことです。ただし、一時テーブルをグローバルクエリに入れても、引き続きアクセスできます。次に、通常どおり、システムテーブルに列情報を照会します。

    Create PROCEDURE TheProcedure                   
    AS                  
    BEGIN                   
        select 1 id,                
            'textstring' textstring,            
            convert(bit, 'true') boolean            

    END                 
    GO                  

    drop table ##test                   

    declare @query varchar(255)                 
    select @query =             'select * ' 
    select @query = @query +    'into ##test '              
    select @query = @query +    'from Openquery([' + @@SERVERNAME + '], ''exec misdb.dbo.TheProcedure'') '              

    EXEC(@query)                    

    select AC.name columnName,                  
        T.name dataType             
    from tempdb.Sys.columns AC                  
    join tempdb.sys.types T                 
        on AC.system_type_id = T.system_type_id             
    where object_id = object_id('tempdb.dbo.##test')
    order by AC.column_id

/*
columnName  dataType
----------  --------
id          int
textstring  varchar
boolean     bit
*/
2
solutionist