1

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

消息 8120,级别 16,状态 1,过程测试,第 17
行列“@t.Country”在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。错误'

但我只想'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

4 回答 4

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并且没有简单的方法可以在/中创建过程。TRYCATCH

于 2012-11-23T14:04:14.467 回答
0

像上面那样修复存储过程创建语句是抑制错误消息的唯一方法。

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

于 2012-11-22T15:27:53.400 回答
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 中的工作原理至关重要。

于 2012-11-22T12:19:39.930 回答
0

这里有两个问题。

正如马丁史密斯指出的那样,主要问题是您的错误来自create procedure声明。不是从exec。进一步详细说明,这是一个解析和编译错误,表明您无法选择一个列和一个聚合函数,而没有 group by(ing) 它。做这个。

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

于 2014-05-22T04:57:21.983 回答