Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 捕获存储过程中的错误消息_Sql_Stored Procedures_Sql Server 2012 - Fatal编程技术网

Sql 捕获存储过程中的错误消息

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 =

如何捕获错误消息等“将数据类型varchar转换为datetime时出错”

这个错误被放入Select输出中

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==>