Sql 捕获存储过程中的错误消息
如何捕获错误消息等“将数据类型varchar转换为datetime时出错” 这个错误被放入Select输出中Sql 捕获存储过程中的错误消息,sql,stored-procedures,sql-server-2012,Sql,Stored Procedures,Sql Server 2012,如何捕获错误消息等“将数据类型varchar转换为datetime时出错” 这个错误被放入Select输出中 BEGIN SET NOCOUNT ON; begin try UPDATE projects SET projectUser = @projectUser, projectStartDate = @projectStartDate where projectId =
BEGIN
SET NOCOUNT ON;
begin try
UPDATE projects
SET
projectUser = @projectUser,
projectStartDate = @projectStartDate
where projectId = @projectId
SELECT 'OK'
end try
begin catch
SELECT 'ERROR - msg error'
end catch
COMMIT
END
我不需要==>
任何解决方案?您可以选择如下所示的错误消息
Begin Catch
SELECT 'Error_Message: ' + ERROR_MESSAGE() + ' Error_Line: ' + ERROR_LINE() AS ErrorMessage
End Catch
如果您只需要错误消息,请使用下面的脚本
BEGIN CATCH
SELECT 'Error_Message :'+ERROR_MESSAGE()
END CATCH
样本输出:
您遇到的问题是错误没有发生在过程中,而是在调用过程时发生的。在一个简单的示例中,创建以下过程:
IF OBJECT_ID(N'dbo.ErrorCatchTest', 'P') IS NOT NULL
DROP PROCEDURE dbo.ErrorCatchTest;
GO
CREATE PROCEDURE dbo.ErrorCatchTest @int INT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DECLARE @T TABLE (I INT);
INSERT @T (I) VALUES (5.0 / @int);
SELECT 'OK';
END TRY
BEGIN CATCH
SELECT CONCAT('Error_Message: ', ERROR_MESSAGE());
END CATCH
END;
EXECUTE dbo.ErrorCatchTest @int = 1;
如果我将有效的INT
传递给过程:
IF OBJECT_ID(N'dbo.ErrorCatchTest', 'P') IS NOT NULL
DROP PROCEDURE dbo.ErrorCatchTest;
GO
CREATE PROCEDURE dbo.ErrorCatchTest @int INT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DECLARE @T TABLE (I INT);
INSERT @T (I) VALUES (5.0 / @int);
SELECT 'OK';
END TRY
BEGIN CATCH
SELECT CONCAT('Error_Message: ', ERROR_MESSAGE());
END CATCH
END;
EXECUTE dbo.ErrorCatchTest @int = 1;
我根据需要获得OK
如果我通过0
强制执行错误:
EXECUTE dbo.ErrorCatchTest @int = 0;
您将根据需要获得错误消息,但如果我尝试传递无效的整数:
EXECUTE dbo.ErrorCatchTest @int = 'Not a number';
然后我得到错误消息,因为错误不在过程中,而是在对参数进行隐式转换时
解决方法是在try/catch块中调用过程:
BEGIN TRY
EXECUTE dbo.ErrorCatchTest @int = 'Not a number';
END TRY
BEGIN CATCH
SELECT CONCAT('Error_Message: ', ERROR_MESSAGE());
END CATCH
用您正在使用的数据库标记您的问题。还显示导致代码失败的示例数据。标记正在使用的dbms。(看起来像是特定于产品的代码。)与其担心如何捕获错误消息,不如修复它。我所看到的引发此错误的最有可能的方式是,将
@projectStartDate
作为varchar传递给过程/查询。只要更改参数的数据类型以匹配列的数据类型,您就解决了问题。如果您坚持使用不正确的数据类型并处理错误,那么您可以使用来捕获它。@jarlh SQL 2012我想要结果,因为我不知道是否可能get==>