2013-02-12 115 views
1

我失去了我的理智在這個SQL代碼的運行。當使用簡單的PRINT語句進行測試時,下面的IF ELSE語句正常工作,即表格不存在,因此它會打印'FALSE'。但是,當我取消註釋SET語句並執行時,它會嘗試運行SET語句,並且由於該表不存在而自然給出錯誤。SET語句總是不管ELSE條件

DECLARE @zeus_calls310_counter int; 

IF EXISTS (SELECT * FROM [zeus].tpza.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'calls_310') 
BEGIN 
    --SET @zeus_calls310_counter = (SELECT COUNT(*) FROM [zeus].[tpza].[dbo].[calls_310]); 
    PRINT 'TRUE' 
END 
ELSE 
BEGIN 
    PRINT 'FALSE'; 
END 
+0

您使用的是什麼品牌的SQL? – 2013-02-12 09:17:17

+0

應該是mssql – 2013-02-12 09:18:14

回答

-1

試試這個:

DECLARE @zeus_calls310_counter int; 

IF EXISTS (SELECT * FROM [zeus].tpza.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'calls_310') 
BEGIN 
    SET @zeus_calls310_counter = (SELECT COUNT(*) FROM [zeus].[tpza].[calls_310]); 
    PRINT 'TRUE' 
END 
ELSE 
BEGIN 
    PRINT 'FALSE'; 
END 
-1

使用此檢查表是否存在

IF OBJECT_ID(N'[zeus].[table_name]', N'U') IS NULL 
BEGIN 
    -- 
END 
ELSE 
BEGIN 
    -- 
END 
3

你的標題代表您的理解出了問題。在該表不存在的情況下,這不就是SET聲明運行並給出了一個錯誤;這是當聲明是解析有錯誤。

當你運行一些SQL,服務器首先解析的語句,然後,如果解析成功,運行它。所以你不能擁有依賴於表的存在的裸SQL!你SET說明會解析與否表存在 - 所以當它沒有,解析失敗。

一種解決方法是包裝那些依賴於可以或可以不內EXEC存在對象的語句。但是,在這種情況下,您希望使用該表上的查詢結果填充變量,並且該變量不在作用域內。所以,我們需要更詳細的你在做與@zeus_calls310_counter做什麼 - 如果它要來後不久使用,也許你可以包住整個事情,包括它的聲明,在EXEC

1

@AAkashM是在正確的軌道上。

如果使用EXEC sp_executesql你還可以指定輸出參數,而你的情況將包含SELECT COUNT語句的結果。