2013-10-24 92 views
9

EXEC @sql使用臨時表我有它們作爲下面的一個存儲過程和部分: @DRange是一個呼入VARCHAR值在存儲過程

declare @sql varchar(max) 
set @sql = 'select * into #tmpA from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1' 

exec (@sql) 

select * from #tmpA 

問題是,當我執行存儲過程,會出現錯誤消息: 找不到對象「#tmpA」,因爲它不存在或您沒有權限。

是不是可以使用臨時表並執行它或我做錯了什麼?

+1

爲什麼使用動態SQL?你不能有一個普通的查詢'select * into Tablet from TableA where create_date> = getDate - @ DRange and is_enabled = 1'? Covert @DRange根據需要分爲不同類型 –

+0

因爲我需要將其他參數(如數據庫名稱)合併到查詢中。 –

回答

7

#tmpA是在不同的範圍內創建的,所以在動態SQL之外是不可見的。您可以將最終的SELECT作爲動態SQL的一部分。另外一對夫婦的其他東西:

DECLARE @sql NVARCHAR(MAX); 

SET @sql = N'select * into #tmpA from dbo.TableA 
    where create_date >= DATEADD(DAY, [email protected], GETDATE()) 
    AND is_enabled = 1; SELECT * FROM #tmpA'; 

EXEC sp_executesql @sql, N'@DRange INT', @DRange; 

當然,如果你正在做的是選擇,我也很難理解爲什麼這是擺在首位的動態SQL。我假設你的查詢(或你後來對臨時表做了什麼)比這更復雜 - 如果是這樣,請不要爲我們瞎折騰。告訴我們你的整個問題會阻止很多來回,因爲額外的細節可能會改變答案。

+1

感謝您的評論,我使用## tmpA而不是#tmp,問題已解決。 –

+10

@WilliamTang不,它沒有。你知道什麼是## tmpA嗎?這將創建一個GLOBAL臨時表。猜猜當兩個人同時運行這個存儲過程時會發生什麼(不管你的日期範圍或數據庫參數是什麼)。 –

1

這是我會做的。

declare @sql varchar(max) 

set @sql = 'select * from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1' 

Select * Into #tmpA from TableA where create_date = '01/01/1000' -- to create a blank table 

insert into #tmpA 

exec (@sql) 

select * from #tmpA