2012-02-18 66 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 2012-02-18 06:25:37

+0

[Execute sp_executeSql for select ... into #table but但不能選擇Temp表數據](http://stackoverflow.com/questions/8040105/execute-sp-executesql-for-select-成表 - 丁斜面選出-TEMP-表-DA) – 2012-02-20 06:28:43

回答

4

你的臨時表僅限於您的動態查詢的範圍。

您可以將您的select * from #tempadd語句添加到您的@sql查詢的末尾。或者我認爲你可以在動態查詢之前定義#tempadd,它應該是可訪問的,但我不確定。

1

thanks to this blog

這裏的問題是會議的範圍。當我們通過EXEC或sp_executesql執行動態sql時,會爲子會話創建一個新的作用域。會話關閉後,會話中創建的任何對象都將立即被刪除。

我發現這個問題的一個解決方案是在「父」範圍中創建表,然後使用動態sql修改表。爲了這個工作,用最少的一組柱來創建一個表。然後我們使用ALTER TABLE語句和動態SQL。兒童會話訪問父會話創建的對象,因此該表可以使用動態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 

此表是可見的,兩列會顯示出來。