2013年10月29日 星期二

[MS SQL]使用#Temp Table在if…else if 條件分支使用小筆記

前言


因為工作的關係,這幾個月來開始大量接觸複雜T-SQL,所以遇到有些問題都會筆記下來,順便做個分享(真懷念程式與DB權責分離的時候 T___T)

 

Temporary Tables


在SQL Server裡,創建方式又分為Create及Declare,前者儲存於DB的TempDB中,後者儲存於記憶體裡,當Session關閉連線時,暫存Table將會Drop掉。
暫存表的使用方式可以參考以下文章:

MS SQL 建立暫存表格 temp table
建立#TempTable與Declare @TempTable有何差別

 

條件分支遇到的問題


今天撰寫Temp Table遇到了if…else if遇到了執行錯誤的問題,我試著用簡單的邏輯來記錄下來。
這是一個很簡單的if…else if判斷,但在不同的分支下加入暫存表的寫法就會發生2714的錯誤

image

在into之前drop掉也無法:

image

後來找到微軟有官方的解答(機器翻譯),照他給的Sample Code進行些修改,將定義Table的抽出外層,不同的是,他的Temp欄位只有一個,而我的欄位有非常多所以不可能一個一個宣告,所以我先Select top 0 將欄位INTO到Temp Table,接著再依不同條件Inserty資料,改寫完的Code如下:
-- 如果Temp Table存在,則清除
IF object_id(N'tempdb.dbo.#TempTable') IS NOT NULL drop table TempTable

select TOP 0 * INTO #TempTable from DemoTable

if (1=1) 
    begin
        INSERT INTO #TempTable 
        select * from DemoTable where ColumnName = 'Filter1'
    end
else if (1=2)
    begin
        INSERT INTO #TempTable
        select *  from DemoTable where ColumnName = 'Filter2'
    end

SELECT * FROM #TempTable

--Do something ....

--

Reference

http://stackoverflow.com/questions/4155996/sql-insert-into-temp-table-in-both-if-and-else-blocks

http://social.msdn.microsoft.com/forums/sqlserver/en-US/42a377a6-8d2f-4666-bf86-f0d005cde51c/tsql-same-temp-table-in-if-else-block-error

http://deanma.blogspot.tw/2012/01/ms-sql-temp-table.html

沒有留言:

張貼留言