ストアドプロシージャが返すものを、列名とその型とともに取得しようとしています。テーブルでこれを行うことはできますが、ストアドプロシージャについては理解できませんでした。 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です。
何か案は?ありがとう。
特にオブジェクトの場合は、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 です。
新しいシステムストアドプロシージャsp_describe_first_result_set
を使用できるはずです- 詳細については、MSDNドキュメントを参照してください :
EXEC sp_describe_first_result_set N'YourStoredProcedureNameHere'
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
*/