2011-11-07 31 views
25

正嘗試將...選擇到temp表中#TempTable中的sp_Executedsql中。 不是它成功插入或沒有,但有消息寫在 (359行受影響),意味着成功插入? 文件下面對select ...執行sp_executeSql進入#table但無法選擇Temp表數據

DECLARE @Sql NVARCHAR(MAX); 
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable 
      from SPCTable with(nolock) 
      where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To'; 

SET @Sql = 'DECLARE @Date_From VARCHAR(10); 
      DECLARE @Date_To VARCHAR(10); 
      SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      '+ @Sql; 

EXECUTE sp_executesql @Sql; 

執行後,其返回我的消息(359行(S)的影響)。 接下來嘗試從#TempTable中選擇數據。

Select * From #TempTable; 

其返回我:

Msg 208, Level 16, State 0, Line 2 
Invalid object name '#TempTable'. 

只是懷疑它的工作只是 '選擇' 一節。插入不起作用。 如何修復它?

回答

25

本地臨時表#table_name在當前會話中僅可見,全局臨時表##table_name在所有的會話可見。兩人都活到他們的會議結束。 sp_executesql - 創建自己的會話(也許單詞「範圍」會更好),所以這就是它發生的原因。

+2

我認爲這個詞的「範圍」會更好。 'DECLARE @sql NVARCHAR(MAX); SET @sql ='SELECT @@ SPID'; EXECUTE sp_executesql @sql; SELECT @@ SPID' –

+0

謝謝@Michal,我記得已經使用這種方法。再次感謝 – Worgon

+0

問題是如何解決它。不是爲什麼它打破。我在下面提供了正確的答案。 'INSERT INTO @tmpTbl EXEC sp_executesql @ sql' –

3

臨時表的生存時間與創建它們的連接一樣長。我希望你無意中在單獨的連接上發佈選擇。您可以通過暫時將其插入到非臨時表中並查看您的數據是否存在來對此進行測試。如果是這種情況,您可以回到原來的解決方案,並確保將連接對象傳遞給您的選擇。

29

在這種情況下使用全局臨時表可能會導致問題,因爲表會在會話之間存在,並可能導致使用調用代碼異步的一些問題。

如果在調用sp_executesql之前定義了本地臨時表,則可以使用它。

CREATE TABLE #tempTable(id int); 

sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable'; 

SELECT * FROM #tempTable; 
1

要解決此問題,請在運行sp_executesql之前首先使用CREATE TABLE #TEMPTABLE命令生成空臨時表。然後使用sp_executesql運行INSERT INTO #TEMPTABLE。這將工作。這是我如何克服這個問題,因爲我有一個設置,其中我的所有查詢通常通過sp_executesql運行。

1
declare @sql varchar(1000) 
set @sql="select * into #t from table;" 
set @sql [email protected] + "select * from #t;" 

execute SP_EXECUTESQL @sql 
4

在你@sql字符串,不插入into #TempTable。相反,請撥打SELECT聲明而不要使用INSERT聲明。

最後結果插入您的臨時表像這樣:

INSERT INTO @tmpTbl EXEC sp_executesql @sql