質問: ストレージプロジャジャの結果を一時テーブルに挿入する どのようにselect * into [temp table] from [stored procedure]をするのですか? from [table]ではなく[temp table]を定義せずに?select businesslineからtmpbuslineまでのすべてのデータは正常に機能します。select * into tmpbusline from businessline 私は同じことを試みていますが、データを返すstored procedureを使うことは全く同じではありません。select * into tmpbusline from exec getbusinesslinehistory '16 mar 2009' 出力メッセージ: メッセージ156、レベル15、状態1、行2キーワード 'exec'の近くに誤った構文があります。 出力ストアドプロシージャと同じ構造を持つ一時テーブルを作成するいくつかの例を読みましたが、これは問題なく動作しますが、列を指定しないのがいいでしょう。
回答: openrowsetが問題を引き起こしている場合、2012年以降は別の方法があります。ここで説明したように、sys.dm_exec_describe_first_result_set_for_objectを使用します。 列名とストアドプロシージャの型を取得しますか? まず、このストアドプロシージャを作成して、一時的なsqlを生成します。create procedure dbo.usp_getstoredproctabledefinition( @procedurename nvarchar(128), @tablename nvarchar(128), @sql nvarchar(max) output ) as set @sql = 'create table ' + @tablename + ' (' select @sql = @sql + '['+name +'] '+ system_type_name +'' + ',' from sys.dm_exec_describe_first_result_set_for_object ( object_id(@procedurename), null ); --remove trailing comma set @sql = substring(@sql,0,len(@sql)) set @sql = @sql +')' プロシージャを使用するには、次の方法で呼び出します。declare @sql nvarchar(max) exec dbo.usp_getstoredproctabledefinition @procedurename='dbo.usp_yourprocedure', @tablename='##yourglobaltemptable',@sql = @sql output insert into ##yourglobaltemptable exec [dbo].usp_yourprocedure select * from ##yourglobaltemptable グローバル一時テーブルを使用していることに注意してください。これは、execを使用して動的sqlを実行すると独自のセッションが作成されるため、通常の一時テーブルは後続のコードの範囲外になるためです。グローバル一時テーブルに問題がある場合、canは通常の一時テーブルを使用できますが、後続のsqlは動的である必要があります。 execステートメントによって。