web-dev-qa-db-ja.com

TSQLは動的SQLから一時テーブルに選択します

これは比較的単純に思えますが、明らかにそうではありません。

Select into構文を使用して、既存のテーブルに基づいて一時テーブルを作成する必要があります。

SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE

問題は、既存のテーブル名がパラメーターを介して受け入れられることです...

次の方法でテーブルのデータを取得できます。

execute ('SELECT * FROM ' + @tableName)

しかし、実行の結果を一時テーブルに直接入れることができるように、どうやって2つを結婚させるのでしょうか。

これが使用される各テーブルの列は同じではないため、データを取得する前に一時テーブルを構築することは実用的ではありません。

グローバル一時テーブルを使用する以外の提案は受け付けています。

更新:

これは完全にばかげていますが、グローバル一時テーブルに関する私の予約は、これがマルチユーザープラットフォームであるため、テーブルが長期間残る場合に問題になりやすいということです...

Sooo ..この部分を通過するために、executeを使用してグローバル一時テーブルを生成することから始めました。

execute('select * into ##globalDynamicFormTable from ' + @tsFormTable) 

次に、グローバル一時テーブルを使用してローカル一時テーブルをロードします。

select * into #tempTable from ##globalDynamicFormTable

次に、グローバルテーブルを削除します。

drop table ##globalDynamicFormTable

これは汚くて好きではありませんが、当分の間、より良い解決策が得られるまで、それは機能しなければなりません。

最後に:

それを回避する方法はないと思います。

最良の答えは次のいずれかです。

Executeコマンドでviewを作成し、それを使用してストアドプロシージャのローカル一時テーブルをロードします。

Executeコマンドでグローバル一時テーブルを作成し、それを使用してローカル一時テーブルをロードします。

ビューの作成と削除は私の組織で監査されているため、おそらくグローバルな一時テーブルに固執するだろうと言われています。

ありがとう!

18
Patrick

実用的な例。

DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'YourTableName'

EXECUTE ('SELECT * INTO #TEMP  FROM ' + @TableName +'; SELECT * FROM #TEMP;')

アクセス可能な一時テーブルを備えた2番目のソリューション

DECLARE @TableName AS VARCHAR(100)
SELECT @TableName = 'YOUR_TABLE_NAME'

EXECUTE ('CREATE VIEW vTemp AS
        SELECT *
        FROM ' + @TableName)
SELECT * INTO #TEMP  FROM vTemp 

--DROP THE VIEW HERE      
DROP VIEW vTemp

/*START USING TEMP TABLE
************************/
--EX:
SELECT * FROM #TEMP


--DROP YOUR TEMP TABLE HERE
DROP TABLE #TEMP
23
Kaf
declare @sql varchar(100);

declare @tablename as varchar(100);

select @tablename = 'your_table_name';

create table #tmp 
    (col1 int, col2 int, col3 int);

set @sql = 'select aa, bb, cc from ' + @tablename;

insert into #tmp(col1, col2, col3) exec @sql;

select * from #tmp;
1
Hayk

ダイナミックSQLでピボットを使用してどのようにしたか(#AccPurchはこれより前に作成されました)

DECLARE @sql AS nvarchar(MAX)
declare @Month Nvarchar(1000)

--DROP TABLE #temp
select distinct YYYYMM into #temp from #AccPurch AS ap
SELECT  @Month = COALESCE(@Month, '') + '[' + CAST(YYYYMM AS VarChar(8)) + '],' FROM    #temp

SELECT   @Month= LEFT(@Month,len(@Month)-1)


SET @sql = N'SELECT UserID, '+ @Month + N' into ##final_Donovan_12345 FROM (
Select ap.AccPurch ,
       ap.YYYYMM ,
       ap.UserID ,
       ap.AccountNumber
FROM #AccPurch AS ap 
) p
Pivot (SUM(AccPurch) FOR YYYYMM IN ('+@Month+ N')) as pvt'


EXEC sp_executesql @sql

Select * INTO #final From ##final_Donovan_12345

DROP TABLE  ##final_Donovan_12345

Select * From #final AS f
0