2012-02-18 5 views
-1
declare @TableName nvarchar(max) 
set @TableName='addresses' 

DECLARE @sql NVARCHAR(MAX) 
set @sql= 'create table #tempadd (' 
SELECT @[email protected] + STUFF(-- Remove first comma 
( 
SELECT ', ' + column_name+' '+ case when DATA_TYPE='varchar' then DATA_TYPE +'(500)' else DATA_TYPE end FROM -- create comma separated values 
( 
    SELECT column_name,DATA_TYPE FROM information_schema.columns where table_name = @TableName --Your query here 
) AS T FOR XML PATH('') 
) 
,1,1,'') 

set @sql [email protected]+') ' 


print @sql 

--SET @sql='SELECT * into #tempadd FROM '[email protected]+ ' WHERE 1=2' 


EXEC sp_executesql @sql 

select * from #tempadd 

を使用して一時テーブルを作成するにはこれはエラーになり:それは内で定義されているのでエラーは、動的SQLに

Msg 208, Level 16, State 0, Line 25
Invalid object name '#tempadd'.

+0

なぜ-1ですか?任意のコメントを外して – rahularyansharma

+0

可能な複製[select ...のためのsp_executeSqlを#tableに実行するが、Temp Table Dataを選択する](http://stackoverflow.com/questions/8040105/execute-sp-executesql-for-select-テーブル・アンド・カント・セレクト・アウト・テンポラリ・テーブル・ダ) –

答えて

4

あなたの一時テーブルは、あなたの動的なクエリの範囲に制限されています。

@sqlクエリの末尾にselect * from #tempadd文を追加できます。あるいは、動的クエリの前に#tempaddを定義することができ、アクセス可能でなければならないと思いますが、それについては確信していません。

1

thanks to this blog

ここでの問題は、セッションの範囲です。 EXECまたはsp_executesqlを介して動的SQLを実行すると、子セッション用に新しいスコープが作成されます。そのセッションで作成されたオブジェクトは、セッションが閉じられるとすぐに削除されます。

私がこの問題のために見つけた1つの解決策は、「親」スコープにテーブルを作成してから、動的SQLを使用してテーブルを変更することです。これが機能するためには、最小限の列の集合で表が作成されます。次に、動的SQLでALTER TABLEステートメントを使用します。表は、動的SQLで修飾することができるように、子セッションは、親セッションで作成されたオブジェクトへのアクセスを有する:

DECLARE @SQL NVARCHAR(4000) 
CREATE TABLE #Temp (id int null) 
SELECT @SQL = 'ALTER #Temp ADD Col1 int null' 
EXEC (@SQL) 
SELECT * FROM #Temp 
DROP TABLE #Temp 

この表が表示され、両方の列が表示されます。