2012-11-22 66 views
1

我有以下代碼。當執行它打印,因爲它不是在聚合包含 抑制SQL Server 2008中的錯誤消息

消息8120,級別16,狀態1,過程測試,行17
列「@ t.Country」在選擇列表中無效函數或GROUP BY子句。錯誤'

但我只想打印'ERROR'。有沒有辦法抑制錯誤信息?

感謝 SatyaprakashĴ

CREATE PROCEDURE Test 
AS 
    DECLARE @t TABLE 
     (ID INT IDENTITY(1,1) 
     ,Country NVARCHAR(50) 
     ,Year INT 
     ,PopulationInMillions INT 
     ) 

    INSERT @t (Country, Year, PopulationInMillions) 
    VALUES ('US', 2000, 20), 
      ('US', 2001, 22) 

    SELECT Country, MAX(PopulationInMillions) 
    FROM @t  
GO 

BEGIN TRY 
    EXEC Test 
END TRY 
BEGIN CATCH 
    PRINT 'ERROR' 
END CATCH 
+1

錯誤發自'CREATE PROC'而不是'EXEC' –

回答

0

有沒有辦法來取消錯誤信息?

是的,有。

解決您的疑問:

SELECT Country, MAX(PopulationInMillions) 
FROM @t  

像這樣:

  • 添加GROUP BY country像這樣:

    SELECT Country, MAX(PopulationInMillions) 
    FROM @t 
    GROUP BY Country; 
    

    或者,

  • 使用聚合函數Country

    SELECT MAX(PopulationInMillions) 
    FROM @t  
    

我認爲你需要閱讀更多有關:

SELECT Max(Country), MAX(PopulationInMillions) 
FROM @t 

或者,

  • SELECT列表中刪除CountryGROUP BY子句起作用。理解SQL如何分組是非常重要的。

  • +0

    嗨Mahmoud,我的問題不是存儲過程。我不想修復存儲過程。我想修改顯示的信息。 –

    +0

    @SatyaprakashJ - 但是,如果你的存儲過程沒有問題,爲什麼你得到了錯誤代碼? –

    0

    修復上面的存儲過程創建語句是您可以抑制錯誤消息的唯一方法。

    由於語法錯誤,create procedure語句引發錯誤。存儲過程從不在數據庫中創建。開始嘗試不執行存儲過程,因爲該過程不存在。您可以將EXEC {任何}放入嘗試以顯示文本錯誤。

    1

    如果錯誤實際發生TRY塊的,那麼,你可以 - 完全按照你已經證明:

    BEGIN TRY 
        RAISERROR('Hello!',16,1) 
    END TRY 
    BEGIN CATCH 
        PRINT 'ERROR' 
    END CATCH 
    

    只是打印ERROR。同樣的:

    create procedure P 
    AS 
        RAISERROR('World!',16,1) 
    GO 
    BEGIN TRY 
        EXEC P 
    END TRY 
    BEGIN CATCH 
        PRINT 'ERROR' 
    END CATCH 
    

    也只是打印ERROR

    但是,正如其他人試圖告訴你的,如果錯誤發生在他們進入之前,如何構造您的TRY/CATCH並不重要。並且沒有簡單的方法創建程序在TRY/CATCH

    0

    這裏有兩個問題。

    主要問題是,如Martin Smith指出,您的錯誤來自create procedure聲明。不是從exec。進一步詳細說明,這是一個解析和編譯錯誤,指示您不能通過選擇列來選擇列和聚合函數。做這個。

    SELECT Country, MAX(PopulationInMillions) 
        FROM @t 
        GROUP BY Country --add this line 
    

    但即使你(嘗試)做

    begin try 
        DECLARE @t TABLE 
         (ID INT IDENTITY(1,1) 
         ,Country NVARCHAR(50) 
         ,Year INT 
         ,PopulationInMillions INT 
         ) 
    
        INSERT @t (Country, Year, PopulationInMillions) 
        VALUES ('US', 2000, 20), 
          ('US', 2001, 22) 
    
        print N'Before error'; 
    
        SELECT Country, MAX(PopulationInMillions) 
        FROM @t 
        --GROUP BY Country --comment in attempt to cause error 
    
        print N'After error'; 
    
    end try 
    begin catch 
        print N'Caught error'; 
    end catch 
    

    你甚至不會得到print N'Before error';因爲錯誤消息8120是一個致命錯誤在分析返回和編譯時間。整個批次甚至沒有執行。

    這裏有一個很好的文章在理解了查詢如何處理http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/

    下面是從時間的好文章有沒有的try ... catch呢。但是理解致命/非致命sql錯誤的好資源。 http://www.sqlteam.com/article/handling-errors-in-stored-procedures