例子一~定義臨時表的問題~ 有時候我們在定義臨時表的時候很習慣就這樣寫~IF OBJECT_ID('tempdb..#Tmp') IS NOT NULL DROP TABLE #TmpIF 1 < 2 SELECT * INTO #Tmp FROM dbo.TestTBELSE ...
例子一~定義臨時表的問題~
有時候我們在定義臨時表的時候很習慣就這樣寫~
IF OBJECT_ID('tempdb..#Tmp') IS NOT NULL DROP TABLE #Tmp IF 1 < 2 SELECT * INTO #Tmp FROM dbo.TestTB ELSE SELECT * INTO #Tmp FROM dbo.TestTR1
但是這樣紙是會被編譯器趕出來的~會報上
消息 2714,級別 16,狀態 1,第 7 行
資料庫中已存在名為 '#Tmp' 的對象。
這樣紙的錯誤。這是因為在作用域下麵,每一個變數/臨時表只能聲明一次,雖然說在邏輯上面上面的語句沒問題,但是確實是聲明瞭2次,所以編譯器就把它攆出來了╮(╯_╰)╭。
通常解決這個東西,比較常見的方法有2個
1、如果結構一致,那麼就先先創建好臨時表,然後在邏輯判斷的時候插入數據
2、使用動態語句來創建臨時表,例子如下 。恩~我通常使用的解決方法就是這2種了
IF OBJECT_ID('tempdb..#Tmp') IS NOT NULL DROP TABLE #Tmp DECLARE @Sql NVARCHAR(100) IF 1 < 2 SELECT @Sql = 'SELECT * INTO #Tmp FROM dbo.TestTB SELECT * FROM #Tmp' ELSE SELECT @Sql = 'SELECT * INTO #Tmp FROM dbo.TestTR1 SELECT * FROM #Tmp' EXEC (@Sql)
例子二~表名是變數
更多時候,有時候想通過不同邏輯去查不同表的時候,有時候就會這樣寫~也是不行滴凸(艹皿艹 )
DECLARE @TableName varchar(50) = 'AAA' SELECT * FROM @TableName
這樣紙還是只能通過動態語句去拼接,因為動態語句是執行的時候再去去編譯的。所以沒問題。
恩~就是這樣紙~