2010-01-15 30 views
2

後如何訪問不是Temptable我使用其中@db1將在運行時提供的聲明動態創建它

SELECT * 
INTO  #gsig_ref 
FROM  gsign 
WHERE  [name] NOT LIKE 'RESERVE%' OR [name] NOT LIKE 'Spare%' 



EXECUTE('SELECT * INTO #db1 FROM ' + @db1) 
EXECUTE('SELECT * INTO #db2 FROM ' + @db2) 

(用於如@db1 = '#gsig_ref'

如果我說select * from #db1 ...它說無效的對象。 並請幫我如何從#db1訪問數據..因爲我已經在另一個查詢使用像

SELECT  DISTINCT @p1 INTO #curs_name 
FROM   #db1 
WHERE   @p1 NOT IN (SELECT @p2 FROM #db2) 
ORDER BY  @p1 

如何#db1在上面的查詢被acccessed也@p1是輸入變量,這個程序我應該使用它的distinct @p1 ..

請幫我在幹活這個 感謝 拉姆

感謝 拉姆

+0

:(:(...應該還是更高?:(:'( – Ramm

回答

2

過程結束時會刪除在存儲過程中創建的本地臨時表;其他存儲過程或調用進程無法看到它們。

您可以生成整個SQL,臨時表有效地移動到動態SQL,如:

declare @sql varchar(max); 
set @sql = 'select into #t1 ....; select * from #t1'; 
exec (@sql); 

如果我讀了,我不知道爲什麼你的外部程序,甚至需要臨時表,但也有可能這是很好的理由。

另一種選擇,如果你確定只有一個呼叫是在同一時間執行,是使用一個全局臨時表。他們用雙重散列聲明,如##TempTable。全局臨時表在其過程結束後仍存活,但可以從多個會話中引用。

0

您不能引用在該語句之外的EXEC中聲明的變量(如您的臨時表)語句。

+0

HI ..我能夠通過創建爲常規表,並在年底下降他們解決臨時表,但我有一個選擇statemetn這是 SELECT DISTINCT @ P1爲COL1 INTO #curs_name FROM DB1 WHERE @ P1 NOT IN(SELECT @ P2 FROM DB2) ORDER BY情況下,當@ P1 = '名稱',那麼@ P1 當@ P1 =' param'then @ p1 else @ p1 end 顯示的錯誤是「如果指定SELECT DISTINCT,ORDER BY項必須出現在選擇列表中」。事實上,@ p1作爲參數發送給它可能在運行時改變的過程。如何在這種情況下處理這個問題?@ p2的情況是否如此? 請幫忙。 感謝 拉姆 – Ramm

0

您無法訪問在動態SQL中聲明的臨時表。

但是,如果您在運行動態查詢之前創建臨時表,則可以在該動態查詢中引用它。

在你的榜樣,這將

CREATE TABLE #db1 
(...table definition...) 

CREATE TABLE #db2 
(...table definition...) 

EXECUTE('INSERT #db1 SELECT * FROM ' + @db1) 
EXECUTE('INSERT #db2 SELECT * FROM ' + @db2) 

您還需要建立和執行你的第二個查詢(使用@p1)動態SQL,因爲要使用變量作爲佔位符列名成。

編輯

有沒有簡單的方法,如果你的源表的結構變化來修改該解決方案。

您可以編寫一些代碼來查詢信息模式以生成動態ALTER TABLE腳本並將其應用於臨時表以使其結構與源表匹配,但這可能比您願意承擔的複雜性要複雜。

Andomar建議在動態SQL中執行整個操作可能更適合。

這可能是一個好主意,退後一步,重新評估您嘗試做的是否是您嘗試解決的任何問題的最佳解決方案。

+0

嗨哈珀,感謝您的建議。 但是,@ db1不是一張表..它不斷變化,我無法爲一張表創建TABLE#db1,因爲@ db1每個值的結構都會發生變化。 所以,我早些時候有這個選項,我退出了它,因爲它不會爲我工作。 請任何其他建議 – Ramm