SQL Server存储过程返回代码奇怪
调用此代码的客户端受到限制,只能处理来自存储的特定代码的返回代码。所以,我们修改我们平常合同RETURN -1
上的错误和默认到RETURN 0
如果没有错误SQL Server存储过程返回代码奇怪
如果代码打内catch块,然后返回码默认值是-4而不是0
有谁知道这是从哪里来的?参考
干杯 GBN
IF OBJECT_ID('dbo.foo') IS NOT NULL DROP TABLE dbo.foo
GO
CREATE TABLE dbo.foo (
KeyCol char(12) NOT NULL,
ValueCol xml NOT NULL,
Comment varchar(1000) NULL,
CONSTRAINT PK_foo PRIMARY KEY CLUSTERED (KeyCol)
)
GO
IF OBJECT_ID('dbo.bar') IS NOT NULL DROP PROCEDURE dbo.bar
GO
CREATE PROCEDURE dbo.bar
@Key char(12),
@Value xml,
@Comment varchar(1000)
AS
SET NOCOUNT ON
DECLARE @StartTranCount tinyint;
BEGIN TRY
SELECT @StartTranCount = @@TRANCOUNT;
IF @StartTranCount = 0 BEGIN TRAN;
BEGIN TRY
--SELECT @StartTranCount = 'fish' --generates an error and goes to outer CATCH
INSERT dbo.foo (KeyCol, ValueCol, Comment) VALUES (@Key, @Value, @Comment);
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 2627 --PK violation
UPDATE
dbo.foo
SET
ValueCol = @Value, Comment = @Comment
WHERE
KeyCol = @Key;
ELSE
RAISERROR ('Tits up', 16, 1);
END CATCH
IF @StartTranCount = 0 COMMIT TRAN;
END TRY
BEGIN CATCH
IF @StartTranCount = 0 AND XACT_STATE() <> 0 ROLLBACK TRAN;
RETURN -1
END CATCH
--Without this, we'll send -4 if we hit the UPDATE CATCH block above
--RETURN 0
GO
--please run these **separately**
--Run with RETURN 0 and fish line commented out
DECLARE @rtn int
EXEC @rtn = dbo.bar 'abcdefghijkl', '<foobar />', 'testing'
SELECT @rtn; SELECT * FROM dbo.foo
GO
DECLARE @rtn int
EXEC @rtn = dbo.bar 'abcdefghijkl', '<foobar2 />', 'testing2'
--updated OK but we get @rtn = -4
SELECT @rtn; SELECT * FROM dbo.foo
GO
--uncomment fish line
DECLARE @rtn int
EXEC @rtn = dbo.bar 'abcdefghijkl', '<foobar />', 'testing'
--Hit outer CATCH, @rtn = -1 as expected
SELECT @rtn; SELECT * FROM dbo.foo
与程序玩弄,我可以得到回报-6,如果我插入一个空到foo.KeyCol并取出RAISERROR的内抓住。这是SQL Server正在做的事情,这里记录:Return Values from Stored Procedures。
我以前也读过那篇文章... – gbn 2010-06-03 12:01:50
@gbn,它在这个问题中给出,你也回答了:http://www.sommarskog.se/error-handling-I.html#returnvalue – 2010-06-03 12:21:30
[Erland这里](http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/b39cb2e5-3d49-4266-84dc-565b11ad0ffa/)说,返回值是10减去错误的严重性级别但我无法看到链接文章中提到的内容。 – 2012-01-09 23:15:40
你为什么将“鱼”分配给tinyint? – 2010-06-03 10:55:58
强制执行异常以测试外部CATCH块。看到最后一个EXEC ... – gbn 2010-06-03 11:01:55
抱歉,在我看到您的回复之前,我已删除了我的评论。 (我的评论是虚假的:) – 2010-06-03 11:22:33