在SQL Server 2008中抑制错误消息

时间:2012-11-22 12:16:31

标签: sql sql-server sql-server-2008

我有以下代码。执行时打印

  

Msg 8120,Level 16,State 1,Procedure Test,Line 17
  列'@ t.Country'在选择列表中无效,因为它未包含   在聚合函数或GROUP BY子句中。 ERROR“

但我只想打印'ERROR'。有没有办法来抑制错误信息?

由于 Satyaprakash J

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

4 个答案:

答案 0 :(得分: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创建一个程序。

答案 1 :(得分:0)

  

有没有办法抑制错误信息?

是的,有。

修正您的查询:

SELECT Country, MAX(PopulationInMillions)
FROM @t    

像这样:

  • 像这样添加GROUP BY country

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

    或者,

  • 使用Country的聚合函数:

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

    或者,

  • Country列表中删除SELECT字段:

    SELECT MAX(PopulationInMillions)
    FROM @t    
    

我认为您需要阅读有关GROUP BY子句如何工作的更多信息。了解分组在SQL中的工作方式至关重要。

答案 2 :(得分:0)

修复存储过程创建语句如上所述是唯一可以抑制错误消息的方法。

由于语法错误,create procedure语句引发错误。永远不会在数据库中创建存储过程。 begin尝试不执行存储过程,因为该过程不存在。您可以在尝试中输入EXEC {anything}以显示文本错误。

答案 3 :(得分:0)

这里有两个问题。

主要问题是,正如Martin Smith所指出的那样,您的错误来自create procedure语句。不是来自exec。进一步详细说明,它是一个解析和编译错误,表明您无法通过(out)选择一个列和一个聚合函数。这样做。

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/

这是一篇很好的文章,从那时起它还没有尝试过。但是理解致命/非致命sql错误的良好来源。 http://www.sqlteam.com/article/handling-errors-in-stored-procedures