2

sp_executesql を使用して結果セットを生成するストアド プロシージャがあります。結果の列数はさまざまですが、Col1 Col2 Col3 などの形式になります。

結果を一時テーブルまたはテーブル変数に取得して、作業できるようにする必要があります。問題は、コマンドの実行後に一時テーブルのスコープが失われるため、sp_executesql を使用して動的に行うことができない一時テーブルの列を定義する必要があることです。

グローバル一時テーブルを動的に作成できるようにするため、グローバル一時テーブルを使用するというアイデアをいじりましたが、このプロセスの同時実行によってグローバル一時テーブルが更新される可能性が非常に高くなります。

何か案は?

4

3 に答える 3

4

この投稿で @SQLMenace の助けを借りて、私にとってうまくいく解決策を見つけましたT-SQL 動的 SQL と一時テーブル

要するに、最初に通常の SQL で #temp テーブルを作成する必要があり、その後、さらに動的 SQL ステートメントを使用して構造を変更できます。この例では、@colcount は 6 に設定されています。これを実装すると、別のストアド プロシージャによって決定されます。

IF object_id('tempdb..#myTemp') IS NOT NULL
DROP TABLE #myTemp

CREATE TABLE #myTemp (id int IDENTITY(1,1) )
DECLARE @cmd nvarchar(max)
DECLARE @colcount int
SET @colcount = 6
DECLARE @counter int
SET @counter = 0
WHILE @counter < @colcount
    BEGIN
      SET @counter = @counter + 1
      SET @cmd = 'ALTER TABLE #myTemp  ADD col' + CAST(@counter AS varchar(4)) + ' NVARCHAR(MAX)'
      EXEC(@cmd)
    END

INSERT INTO #myTemp 
EXEC myProc @param1, @param2, @param3

SELECT * FROM #myTemp
于 2011-05-23T17:30:52.377 に答える
2

次のようなことができない理由はありますか?

SELECT *
INTO #MyTempTable
FROM MyResultSet

SELECT INTO明示的なフィールドリストは必要ありません。

于 2011-05-23T16:50:10.370 に答える
2

作成プロセスの SPID によって名前が「一意化」されたグローバル一時テーブルを使用できます。これにより、他の接続によって作成された他のグローバル一時テーブルを踏みにじるのを避けることができます。

完了したら、必ずそれらをクリーンアップしてください... :)

于 2011-05-23T16:51:17.077 に答える