Sql server 在sql server中将错误消息()作为输出变量返回

Sql server 在sql server中将错误消息()作为输出变量返回,sql-server,Sql Server,我想在变量中返回ERROR_MESSAGE(),但这不起作用,因为这类似于引发错误,但我不希望这样。我想接收返回值(0 ok,1 error),加上变量@id中插入的id,如果有错误,则加上变量@ErrorMsg中的error msg 代码如下: CREATE PROCEDURE [cimpl].[TestInsert] ( @TestId INT, @Name NVARCHAR(50), @Id INT OUTPUT, @ErrorMsg NVARCHAR(4

我想在变量中返回ERROR_MESSAGE(),但这不起作用,因为这类似于引发错误,但我不希望这样。我想接收返回值(0 ok,1 error),加上变量@id中插入的id,如果有错误,则加上变量@ErrorMsg中的error msg

代码如下:

CREATE PROCEDURE [cimpl].[TestInsert]
(
    @TestId INT,
    @Name NVARCHAR(50), 
    @Id INT OUTPUT,
    @ErrorMsg NVARCHAR(4000) = NULL OUTPUT 
)
AS
BEGIN

    DECLARE @ReturnVal int

    SET NOCOUNT ON;

    SET @ReturnVal = 0;
    SET @ErrorMsg = '';

    BEGIN TRY

        -- Insert statement
        INSERT [dbo].[Test]
                (
                  [TestId],
                  [Name]
                )
        VALUES  (
                  @TestId, 
                  @Name,                  
                )

        SET @Id = SCOPE_IDENTITY();

    END TRY

    BEGIN CATCH
        SET @ReturnVal = 1;
        SET @ErrorMsg = ERROR_MESSAGE();
    END CATCH

    RETURN @ReturnVal;

END
电话如下:

DECLARE @IdIns INT
DECLARE @ErrorM NVARCHAR(4000)
DECLARE @ReturnValue INT = 0

EXEC @ReturnValue = 
    [cimpl].[TransactInsert]
        @TestId= 'ee', --I'm forcing the error
        @Name = 'A', 
        @Id = @IdIns OUTPUT,
        @ErrorMsg = @ErrorM OUTPUT

SELECT @ErrorM
SELECT @ReturnValue
SELECT @IdIns

存储过程中的代码应按预期工作。问题是您的测试在进程运行之前抛出了一个错误,因为您试图将一个字符值分配给一个整数

在测试代码中:

@TestId= 'ee', --I'm forcing the error

这会在解析和编译时抛出一个错误,因为
@TestId
被定义为
INT
,然而
ee
是一个
CHAR(2)
值,不能合并成一个数字。

你看过下面的帖子吗:我不喜欢这种方法,还有其他方法吗?我不想引起错误,我只想得到作为输出的错误消息。我不确定“解析和编译时”是什么意思,但对我来说,它在调用过程时中断了。我认为错误发生在将char值赋给int参数(或绑定或任何调用)时。因此,永远不会到达proc的错误处理程序,但错误仍然发生在运行时,而不是编译或解析时。