3

我已經搜索過,沒有發現任何關於它的信息(我相信這是不可能的)。我的問題是我必須檢查臨時表是否存在,以及是否有臨時表上的某些特定數據。IF條款中的短路

有沒有人遇到過這個?你是如何設法解決它的?我想避免創建數百萬的IF..ELSE塊。

編輯:

IF (OBJECT_ID('tempdb..#tempTable') IS NOT NULL 
AND EXISTS (SELECT * FROM #tempTable WHERE THIS_COLUMN = 'value')) 
BEGIN 
    PRINT 'Temp table and data exists' 
END 
ELSE 
BEGIN 
    PRINT 'Temp table or data does not exist' 
END 

這是我想做的事情。當tempTable不存在時(可能發生),問題就出現了。它會拋出一個錯誤,因爲儘管第一個stamement返回false,它仍會繼續執行第二個語句。而SELECT語句無法找到該表並因此引發該錯誤。我找到的解決方案是這樣:

IF OBJECT_ID('#tempTable') IS NOT NULL 
BEGIN 
    IF EXISTS (SELECT * FROM #tempTable WHERE THIS_COLUMN = 'value' 
    BEGIN 
     PRINT 'Temp table and data exists' 
    END 
    ELSE 
    BEGIN 
     PRINT 'Temp table exists but data does not exist' 
    END 
END 
ELSE 
BEGIN 
    PRINT 'Temp table does not exist' 
END 

我的問題是,有沒有有2個條件,如果第一個條件返回false不檢查第二個的方法嗎?在編程語言中使用&&的種類。

+0

數以百萬計?聽起來像_two_從你的描述。 – Oded

+0

那麼,我必須檢查臨時表是否存在,以及特定數據是否存在很多次。 –

+0

獨家AND?這樣的事情不存在。向我們展示一些您的數據樣本,以及您需要在那裏檢查的具體內容。 – trailmax

回答

3

你試圖做的事是不可能的,因爲這是編譯時失敗,整個語句需要一起編譯。

它不會評估語句的第一部分,然後只有在該情況爲真時才編譯第二部分。您需要將存在的測試和引用表的查詢拆分爲兩個單獨的語句,以便分別編譯它們。

2

參見here

有作爲X和邏輯門(異AND)沒有這樣的事情。理論上,XAND意味着,兩個操作數都是真的,或者兩者都是錯誤的。所以這意味着XAND與Equals(=)相同,至少對於按位邏輯操作而言。

請出示一些示例代碼來說明你正在嘗試做什麼。

問候

+0

添加了代碼示例和簡要說明。 –

2

我已搜查這一段時間以前,如果我沒有記錯的Sql服務器的確短路邏輯條件,但它是誰決定哪一個會先檢查它們出現的順序不分if條款。

+0

[有時它確實有時並不]](http://stackoverflow.com/questions/5542927/sql-server-conditional-flow/5543985#5543985) –

+0

@MartinSmith做了什麼?短路?如果它隨機選擇其中一個條件,那麼它確實會選擇一個條件,而您無法控制它更改代碼中的順序。 –

+0

是的,短路。我以前的評論是一個鏈接到一個答案顯示這一點。 –

0

我看到兩種方式去接近這在MSSQL:

第一。如果您使用sp_executesql(動態sql),您的存儲過程將被編譯而不會出錯。此外,如果#tempTable不存在服務器將輸出錯誤,但繼續執行批處理:

exec sp_executesql N'SELECT count(*) FROM #tempTable WHERE THIS_COLUMN = ''value''' 
if @@rowcount > 0 
    print 'ok' 
else 
    print 'error' 
end; 

二。只需使用嵌套的IF和EXISTS創建用戶定義的函數(就像現在這樣做),它將輸出0和1.並使用動態sql將表名和可能的過濾器值輸入到此UDF。在這種情況下,你可以在IF中使用這個UDF。

+0

這在這裏沒有優勢。這仍然是兩個聲明。如果表不存在,語句無論如何都會受到延遲編譯的影響,所以如果該語句被實際執行,它只是一個問題。如果引用已通過「ALTER TABLE」修改的現有表或執行需要成爲批處理中唯一項的「CREATE」,則只需要這樣做。 –

1

這可能是一個粗略的解決方案,但我有時使用COALESCE語句來控制if,else,then結構的種類。在這種情況下,它看起來更髒一些,因爲我們正在尋找coalesce語句的反例。

DECLARE @temp_message AS varchar(100) 
SELECT @temp_message = COALESCE(CASE 
           WHEN OBJECT_ID('tempdb..#tempTable') IS NOT NULL THEN NULL 
           ELSE 'Temp table does not exist' 
           END, 
           CASE 
           WHEN EXISTS (SELECT * FROM #tempTable WHERE THIS_COLUMN = 'value') THEN NULL 
           ELSE 'Specified value does not exist in temp table' 
           END, 
           'Temp table and data exists') 

PRINT @temp_message 

COALESCE運行一個接一個的語句,直到一個不產生NULL值。這意味着你可以做很酷的事情,比如運行一系列小的查詢來檢查一些值,然後再運行一個代價很高的查詢。讓我知道這是否真的非法!它在我的機器上工作:)