これは比較的単純に思えますが、明らかにそうではありません。
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コマンドでグローバル一時テーブルを作成し、それを使用してローカル一時テーブルをロードします。
ビューの作成と削除は私の組織で監査されているため、おそらくグローバルな一時テーブルに固執するだろうと言われています。
ありがとう!
実用的な例。
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
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;
ダイナミック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