如何在存储过程中返回错误并插入表中

时间:2015-01-13 17:22:38

标签: sql sql-server tsql stored-procedures

我对SQL Server知之甚少,但基本上我所拥有的是一个应该将参数(id(主键)和测试数据)插入测试表的存储过程,dbo.test

如果无法添加它们,则应将dbo.Error_Log添加到id,test data AND Error information。

我的存储过程如下所示:

    @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

它返回一个填充的dbo.Test,一个空的dbo.Error_Log,由于某种原因返回值为-4

错误是:

  

Msg 2627,Level 14,State 1,Procedure uspTester,Line 21   违反PRIMARY KEY约束'PK__Test__3214EC0775996C4D'。   无法在对象'dbo.Test'中插入重复键。重复的密钥   值是(1)。声明已经终止。

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

1 个答案:

答案 0 :(得分:0)

@@ ERROR变量“返回执行的最后一个Transact-SQL语句的错误号”,即在尝试插入后需要检查@@ 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