我对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中,而不仅仅是完全停止操作。
答案 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