2016-02-05 64 views
1

我想從一個執行路徑通過一個臨時表到另一個嵌套在側它傳遞臨時表從一個執行到另一個

我曾嘗試是這樣的:

DECLARE @SQLQuery AS NVARCHAR(MAX) 

    SET @SQLQuery = ' 
    --populate #tempTable with values 
    EXECUTE('SELECT TOP (100) * FROM ' + tempdb..#tempTable) 

    EXECUTE sp_executesql @SQLQuery 

但它失敗與此錯誤消息:

附近有語法錯誤的tempdb'

在執行上下文之間傳遞臨時表是否有其他更好的方法?

回答

1

您的臨時表將在動態sql內部可見,沒有問題。我不知道你是否在動態sql或之前創建臨時表。

這裏是在動態sql之前創建的表。

create table #Temp(SomeValue varchar(10)) 
insert #Temp select 'made it' 

exec sp_executesql N'select * from #Temp' 
2

您可以使用##tablename語法(雙重散列)創建全局臨時表。所不同的是on the TechNet site

臨時表有兩種類型:local和global。它們的名稱,可見性和可用性各不相同。本地臨時表具有一個數字符號(#)作爲其名稱的第一個字符;它們僅對用戶的當前連接可見,並且在用戶從SQL Server實例斷開連接時它們將被刪除。全局臨時表具有兩個數字符號(##)作爲其名稱的第一個字符;任何用戶在創建後都可以看到它們,並且當引用該表的所有用戶都從SQL Server實例斷開連接時,它們將被刪除。

例如,如果您創建表employees,那麼表中的任何人員都可以使用表中的數據庫中具有安全權限的人員使用該表,直到表被刪除。如果數據庫會話創建本地臨時表#employees,則只有會話可以與該表一起工作,並且會話斷開連接時將被刪除。如果您創建全局臨時表## employees,則數據庫中的任何用戶都可以使用此表。如果在創建後沒有其他用戶使用此表,則在您斷開連接時將刪除該表。如果另一個用戶在創建後使用該表,SQL Server會在您斷開連接並且所有其他會話不再主動使用它之後將其刪除。

如果使用命名約束創建臨時表並在用戶定義事務的作用域內創建臨時表,則一次只有一個用戶可以執行創建臨時表的語句。例如,如果一個存儲過程創建一個具有指定主鍵約束的臨時表,則該存儲過程不能由多個用戶同時執行。

下一個建議可能會更有幫助:

許多臨時表的使用,可以與具有表數據類型的變量來代替。有關使用表變量的更多信息,請參閱table (Transact-SQL)

+1

我會在幾乎所有情況下避免全局臨時表。他們有一些常常被忽視的嚴重問題。它們可用於任何連接,因此併發性是一場噩夢。 –

+0

我把這個問題看成是「我想把臨時表從一個執行路徑傳遞給另一個執行路徑」,並且沒有看到下一個短語「嵌套在裏面」。對於不同上下文中的不同執行路徑,很少有選項可用,而全局臨時表是保存中間聚合數據以供其他調用者以後使用的良好解決方案。如果一切都在同一個查詢會話中,完全同意 - 我不會使用全局臨時表。 – Cahit

+0

在SQL作業中創建全局臨時表如何更安全? –

1

您的語法錯誤的原因是您在EXECUTE內部執行了不必要的EXECUTE,並且您沒有轉義嵌套的單引號。這將是寫它的正確方法:

SET @SQLQuery=' 
--populate #tempTable with values 
SELECT TOP 100 * FROM tempdb..#tempTable' 

但是,我有一種感覺,語法錯誤只是你的問題的開始。雖然不可能告訴你最終在這裏做什麼,但只能看到這麼多的代碼。

+0

嵌套執行的原因是我從中填充tempTable是動態的表名 –

0

你的報價搞砸了。嘗試:

SET @SQLQuery=' 
    --populate #tempTable with values 
    EXECUTE(''SELECT TOP 100 * FROM '' + tempdb..#tempTable + '') ' 
相關問題