[英]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.