SQL Server 存储过程返回码奇怪

SQL Server stored procedure return code oddity(SQL Server 存储过程返回码奇怪)
本文介绍了SQL Server 存储过程返回码奇怪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

调用此代码的客户端受到限制,只能处理来自存储过程的返回代码.因此,我们将通常的合约修改为 RETURN -1 出错,default 修改为 RETURN 0 如果没有错误

The client that calls this code is restricted and can only deal with return codes from stored procs. So, we modified our usual contract to RETURN -1 on error and default to RETURN 0 if no error

如果代码命中内部 catch 块,则返回代码默认为 -4 而不是 0

If the code hits the inner catch block, then the RETURN code default is -4 rather then 0

请问有大佬知道出处吗?参考

Does anyone know where this comes from please? With reference

干杯英镑

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

推荐答案

在玩弄这个过程时,如果我在 foo.KeyCol 中插入一个 null 并删除内部 catch 中的 RAISERROR,我可以得到一个返回值 -6.这是 SQL Server 正在做的事情,并记录在此处:Return Values from Stored Procedures.

In playing around with the procedure, I can get a a return -6, if I insert a null into foo.KeyCol and remove the RAISERROR in the inner catch. This is something SQL Server is doing, and is documented here: Return Values from Stored Procedures.

这篇关于SQL Server 存储过程返回码奇怪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Execute complex raw SQL query in EF6(在EF6中执行复杂的原始SQL查询)
SSIS: Model design issue causing duplications - can two fact tables be connected?(SSIS:模型设计问题导致重复-两个事实表可以连接吗?)
SQL Server Graph Database - shortest path using multiple edge types(SQL Server图形数据库-使用多种边类型的最短路径)
Invalid column name when using EF Core filtered includes(使用EF核心过滤包括时无效的列名)
How should make faster SQL Server filtering procedure with many parameters(如何让多参数的SQL Server过滤程序更快)
How can I generate an entity–relationship (ER) diagram of a database using Microsoft SQL Server Management Studio?(如何使用Microsoft SQL Server Management Studio生成数据库的实体关系(ER)图?)