Sql 插入存储过程后返回,如果成功返回1,否则返回0

Sql 插入存储过程后返回,如果成功返回1,否则返回0,sql,sql-server,Sql,Sql Server,我有一个存储过程。插入后,它应该返回一个值:如果插入成功,则返回1,否则返回0 例如: ALTER PROCEDURE [dbo].[sp_save_transaction] -- Parameter @SourceCode nvarchar(255), @DepositorName nvarchar(255), @TransactionDate date AS SET XACT_ABORT ON --BEGIN TRAN DECLA

我有一个存储过程。插入后,它应该返回一个值:如果插入成功,则返回1,否则返回0

例如:

ALTER PROCEDURE [dbo].[sp_save_transaction]
    -- Parameter
    @SourceCode nvarchar(255),
    @DepositorName nvarchar(255),
    @TransactionDate date
AS
    SET XACT_ABORT ON  

    --BEGIN TRAN
    DECLARE @PaymentDate date
    DECLARE @PaymentDepositorName nvarchar(255)
    DECLARE @PaymentNationId int

    SET @PaymentDate = @TransactionDate
    SET @PaymentDepositorName = @DepositorName
    SET @PaymentNationId = (SELECT [NAT_SYS_ID] 
                            FROM [MB_TB_NATION] 
                            WHERE [NAT_CODE] = @DepositorCountry)

    INSERT INTO [dbo].[MB_TB_TRANSACTION]
           ([TRA_PAYMENT_DATE], [TRA_PAYMENT_DEPOSITOR_NAME], [TRA_PAYMENT_NATION_ID])
    VALUES (@PaymentDate, @PaymentDepositorName, @PaymentNationId, )

谢谢你的帮助

您可以通过检查@ERROR属性来实现这一点

大致如下:

IF @@ERROR <> 0 
    BEGIN
        RETURN 0;
    END
ELSE
    BEGIN            
        RETURN 1;
    END;

但是我会把0作为你的成功价值,任何其他都是错误的。然后可以使用不同的值来表示不同的错误状态。除非您直接将结果映射到布尔成功值。

有两种可能的解决方案:第一种基于输出参数,当您运行该参数时,该参数将使用所需的值进行值化。 正如您所问的,其他解决方案只返回所需的结果。 他们都会检查@错误,以了解上次操作是否成功

解决方案A:

ALTER PROCEDURE [dbo].[sp_save_transaction]
    -- Parameter
    @SourceCode nvarchar(255),
    @DepositorName nvarchar(255),`enter code here`
    @TransactionDate date,
    @result int output
AS
SET XACT_ABORT ON  

--BEGIN TRAN
DECLARE @PaymentDate date
DECLARE @PaymentDepositorName nvarchar(255)
DECLARE @PaymentNationId int

SET @PaymentDate = @TransactionDate
SET @PaymentDepositorName = @DepositorName
SET @PaymentNationId = (SELECT [NAT_SYS_ID] FROM [MB_TB_NATION] WHERE [NAT_CODE] = @DepositorCountry)

INSERT INTO [dbo].[MB_TB_TRANSACTION]
           ([TRA_PAYMENT_DATE]
           ,[TRA_PAYMENT_DEPOSITOR_NAME]
           ,[TRA_PAYMENT_NATION_ID]
           )
     VALUES
           (
           @PaymentDate, 
           @PaymentDepositorName, 
           @PaymentNationId, 
           )
  IF @@ERROR = 0 
     SET @result  = 1
  ELSE SET @result = 0
解决方案B:

ALTER PROCEDURE [dbo].[sp_save_transaction]
    -- Parameter
    @SourceCode nvarchar(255),
    @DepositorName nvarchar(255),`enter code here`
    @TransactionDate date
AS
SET XACT_ABORT ON  

--BEGIN TRAN
DECLARE @result int
DECLARE @PaymentDate date
DECLARE @PaymentDepositorName nvarchar(255)
DECLARE @PaymentNationId int

SET @PaymentDate = @TransactionDate
SET @PaymentDepositorName = @DepositorName
SET @PaymentNationId = (SELECT [NAT_SYS_ID] FROM [MB_TB_NATION] WHERE [NAT_CODE] = @DepositorCountry)

INSERT INTO [dbo].[MB_TB_TRANSACTION]
           ([TRA_PAYMENT_DATE]
           ,[TRA_PAYMENT_DEPOSITOR_NAME]
           ,[TRA_PAYMENT_NATION_ID]
           )
     VALUES
           (
           @PaymentDate, 
           @PaymentDepositorName, 
           @PaymentNationId, 
           )
  IF @@ERROR = 0 
     SET @result  = 1
  ELSE SET @result = 0
RETURN @result

使用输出参数。旁注:存储过程不应使用sp_uuu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_u,并使用其他东西作为前缀——或者根本不使用前缀!