2012-02-09 98 views
2

我真的很困惑這個!我相信這很簡單,但真的不知道!T-SQL IF語句解釋

DECLARE @jobid INT = 100 
    IF (@JobID >= 0) 
BEGIN 
SELECT * into #tmp FROM Persons 
end 
    ELSE 
BEGIN 
SELECT * into #tmp FROM Persons1 
end 

它給出了#tmp表已經存在的錯誤!爲什麼它會驗證這兩個陳述!

當然,我的原始查詢是巨大的,做得更多,但這是一個示例來說明我的錯誤。

有人可以解釋一下嗎?

#tmp表不存在,即使您嘗試刪除它或更改名稱,引擎仍然會驗證這兩個語句!

我正在使用2008 R2。

感謝 傑森

+6

,因爲你還沒有降到' #tmp'來自上一次運行? – 2012-02-09 21:20:06

+0

我很肯定你在'ELSE'之後不需要'BEGIN'。另外,根據MSDN ELSE需要在END之後出現嗎? http://msdn.microsoft.com/en-us/library/ms182717.aspx – 2012-02-09 21:23:09

+0

@ p.campbell - 不,那不是它。如果您嘗試了代碼,您會注意到它是引發錯誤而不是運行時的解析器。它們之間的錯誤信息幾乎相同。解析器錯誤會給你'Msg 2714,Level 16,State 1',運行時錯誤會給你'Msg 2714,Level 16,State 6'。 – 2012-02-10 07:00:28

回答

2

您在鏈接的服務器上運行呢? 你沒有刪除之前運行的那個。

嘗試創建#tmp前表IF聲明:

CREATE TABLE #tmp(fields...) 

DECLARE @jobid INT = 100 
IF (@JobID >= 0) 
BEGIN 
    INSERT #tmp 
    SELECT * FROM Persons 
end 
ELSE 
BEGIN 
    INSERT #Tmp 
    SELECT * FROM Persons1 
end 

從查詢以前運行刪除頁首頁上頁一個

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL 
    EXEC('DROP TABLE #tmp') 
GO 

DECLARE @jobid INT = 100 
    IF (@JobID >= 0) 
BEGIN 
SELECT * into #tmp FROM Persons 
end 
    ELSE 
BEGIN 
SELECT * into #tmp FROM Persons1 
end 
+0

感謝Oleg,不,它不是鏈接服務器,只是本地,但表不存在,我試圖理解它爲什麼扔即使有IF OBJECT_ID('#tmp')IS NOT NULL DROP TABLE #tmp GO – JYousef 2012-02-09 21:29:24

+0

因此,在if之前創建它,並查看更新的第二條語句 – 2012-02-09 21:32:52

+1

您需要檢查IF IF OBJECT_ID('tempDB。 。#tmp')不是@diaho寫的。 – 2012-02-09 21:36:56

2

#tmp可能已經創造了tempDB。如果你不使用#tmp隨時隨地在你詢問之前,該塊,你可以不喜歡以下之前的代碼塊,以確保它總是蓄勢待發:

IF OBJECT_ID('tempDB..#tmp') IS NOT NULL 
    DROP TABLE #tmp 
+0

感謝您的回覆......但是請相信與否,它不在那裏....嘗試任何其他名字,仍然給出相同的錯誤! – JYousef 2012-02-09 21:26:59

+0

你是對的@JYousef。 Google搜索錯誤(消息2714,級別16 ...數據庫中已有一個名爲'#tmp'的對象)顯示臨時表存在限制。「Persons」和「Persons1」的模式是相同的嗎?如果是這樣,我會推薦@Oleg推薦的第一個解決方案。 – diaho 2012-02-09 21:47:12

+0

謝謝,是的,我正在使用第一種方式像@ Oleg推薦,但我很困惑,爲什麼它會驗證並給出該錯誤!感謝你的幫助。 – JYousef 2012-02-09 21:52:45