如何 return 存储过程中的错误并插入 table

How to return an error in a stored procedure and insert into a table

我不太了解 SQL 服务器,但基本上我这里有一个存储过程,应该将参数(id(主键)和测试数据)插入到测试中 table, dbo.test

如果添加失败,它应该使用 ID、测试数据和错误信息添加到 dbo.Error_Log。

我的存储过程如下所示:

    @Id int = 0, 
    @Test_column nvarchar(10) = 0
AS
BEGIN

    SET NOCOUNT ON;


    IF @@ERROR <> 0
        BEGIN
        INSERT INTO AdventureWorks2012.dbo.Error_Log ([Id], [Data], [Error_description])
        SELECT  @Id,
                @Test_column,
                @@ERROR
        END
        ELSE
    INSERT INTO AdventureWorks2012.dbo.Test ([Id], [Test_column])
    SELECT  @Id, 
            @Test_column
END

我是这样执行的:

USE [AdventureWorks2012]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[uspTester]
        @Id = 1,
        @Test_column = N'data123'

SELECT  'Return Value' = @return_value

GO


SELECT * FROM AdventureWorks2012.dbo.Test
SELECT * FROM AdventureWorks2012.dbo.Error_Log

它 return 是一个填充的 dbo.Test,一个空的 dbo.Error_Log 和一个 return 由于某种原因的 -4 值

错误是:

Msg 2627, Level 14, State 1, Procedure uspTester, Line 21 Violation of PRIMARY KEY constraint 'PK__Test__3214EC0775996C4D'. Cannot insert duplicate key in object 'dbo.Test'. The duplicate key value is (1). The statement has been terminated.

我需要将该错误输出到 dbo.Error_Log 而不是完全停止操作。

@@ERROR 变量"returns the error number for the last Transact-SQL statement executed" 即您需要在尝试插入后检查@@ERROR。像这样:

BEGIN

SET NOCOUNT ON;


INSERT INTO AdventureWorks2012.dbo.Test ([Id], [Test_column])
SELECT  @Id, 
        @Test_column

IF @@ERROR <> 0
    BEGIN
    INSERT INTO AdventureWorks2012.dbo.Error_Log ([Id], [Data], [Error_description])
    SELECT  @Id,
            @Test_column,
            @@ERROR
    END
END

注意:如果您想要错误消息而不是您将要使用的数字,请使用 ERROR_MESSAGE() 函数:http://msdn.microsoft.com/en-us/library/ms190358.aspx