簡體   English   中英

使用動態SQL創建臨時表時出錯

[英]error in creating a temp table using dynamic sql

declare @TableName nvarchar(max)
set @TableName='addresses'

DECLARE @sql NVARCHAR(MAX)
set @sql= 'create table #tempadd ( '
SELECT @sql=@sql + 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 =@sql+' ) '


print @sql 

--SET @sql='SELECT * into #tempadd FROM '+@TableName+  ' WHERE 1=2'


EXEC sp_executesql @sql

select * from #tempadd

這會導致錯誤:

消息208,級別16,狀態0,第25行
無效的對象名稱“ #tempadd”。

由於臨時表是在其中定義的,因此它僅限於動態查詢的范圍。

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

感謝這個博客

這里的問題是會話的范圍。 當我們通過EXEC或sp_executesql執行動態sql時,將為子會話創建新的作用域。 會話關閉后,該會話中創建的所有對象都會被刪除。

我發現的針對此問題的一種解決方案是在“父”范圍內創建表,然后僅使用動態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

該表可見,並且兩列都將顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM