我有以下代码。执行时打印
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
答案 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