2017-02-16 81 views
2

如果我運行這個動態查詢:臨時表不是從動態查詢執行創建

declare @test nvarchar(1000) = 'select * into #tmp7 from bauser' 
execute(@test) 

,然後嘗試查詢#tmp7有:

select * from #tmp7 

引發錯誤:

無效的對象名稱'#tmp7'。

但是如果我手動運行相同的查詢:

select * into #tmp7 from bauser 

一切都OK。臨時表格被創建並填充結果。

爲什麼它不適用於動態查詢執行?

回答

5

範圍!

臨時表只存在於動態執行的查詢 的範圍。如果你想使選擇把它放在動態查詢裏面

declare @test nvarchar(1000) = 'select * into #tmp7 from bauser 

select * from #tmp7' 
execute(@test) 

你也可以檢查是否使用存在這樣的對象這

select * from sys.sysobjects so where so.name like '%tmp7%' 

看到這個類似的問題 SQL Server 2005 and temporary table scope

編輯

一個臨時表是這樣沒錯,你可以添加這些表駐留在事實上,在tempdb數據庫列,索引等,你甚至可以「找到」他們(他們可以用奇怪的長名稱中可以看出)但它們在執行EXEC後被銷燬。

也許你的問題是嘗試動態的方法或根本不涉及你的問題。試着發表一個新問題,你得到了什麼,你需要做些什麼來獲得進一步的幫助。

+0

什麼是「escope」? – GurV

+0

感謝您的回答,是範圍是問題。以某種方式稍後向#tmp添加一些列可能嗎? – FrenkyB

+0

@FrenkyB看到我的編輯 – jean

2

如果您使用動態SQL創建臨時表,它將不可用於動態SQL作用域之外。

您需要使用動態SQL創建它,然後使用INSERT INTO來填充表格。

-- use this trick to create the temp table easily. 
SELECT * INTO #tmp7 
FROM bauser 
WHERE 1=2 

declare @test nvarchar(1000) = 'insert into #tmp7 select * from bauser' 
execute(@test) 
+0

這就是問題所在 - 我有很多動態創建的列。在運行時間之前,我不知道哪些列將在桌面上。 – FrenkyB

+0

我看,看看我的編輯。 – FLICKER

+0

@FrenkyB如果你真的想開始動態查詢的痛苦訓練,你可以做一個查詢來創建動態查詢,甚至可以創建一個動態查詢來創建動態查詢 – jean