请帮助我尝试捕获存储过程中的异常并回滚


ALTER  PROCEDURE [dbo].[SendSMS_TestMark]
    @EntityID INT , --PolicyID
    @Mobile VARCHAR(11) ,
    @Message VARCHAR(480) ,--What Needs to be send Text
    @ScheduleDateTime DATETIME , --Same date sync
	@DateCreated DATETIME, --Same date sync
    @ProjectID INT -- ClaimType and message type 
AS
BEGIN TRY 
BEGIN TRAN
IF LEN(@Mobile) <= 10 OR (LEN(@Mobile) >=10 )

INSERT  INTO Media_QA.Multimedia.SMS
                ( fkEntityID ,
                  C_EntityType ,
                  Mobile ,
                  Message ,
                  ScheduledDateTime ,
                  DateCreated ,
                  fkProjectID
                )
                SELECT  @EntityID ,
                        776 , --Policy
						 @Mobile,
                        @Message ,
                        @ScheduleDateTime ,
                        @DateCreated ,
                        @ProjectID

END TRY
BEGIN CATCH 
RAISERROR ('Invalid Mobile: Mobile number must be 10 digits', 16,2 )
ROLLBACK
COMMIT TRAN

我尝试过的:

我尝试过交换功能,但它们仍然提交

解决方案3

要补充其他人所说的内容,您需要更加小心您的条件:

SQL
IF LEN(@Mobile) <= 10 OR (LEN(@Mobile) >=10 )

永远为真,因为 OR 的一侧或另一侧永远为真。

解决方案1

我在任何地方都没有看到 END CATCH,所以这将是一个问题。

另外,您不会在任何地方抛出异常供 TRY 块捕获。 仅 IF 语句失败不会引发异常。

坦率地说,我在这里看不到任何需要 TRY/CATCH 的东西。 IF 语句的“假”部分可能会引发返回给调用者的错误。

解决方案2

您的 SP 有语法错误,不应编译。 我对您的 SP 进行了一些更改,使其处于工作状态,但您需要了解您的 SP 存在逻辑错误。

SQL
ALTER  PROCEDURE [dbo].[SendSMS_TestMark]
    @EntityID INT , --PolicyID
    @Mobile VARCHAR(11) ,
    @Message VARCHAR(480) ,--What Needs to be send Text
    @ScheduleDateTime DATETIME , --Same date sync
	@DateCreated DATETIME, --Same date sync
    @ProjectID INT -- ClaimType and message type 
AS
BEGIN TRY 
	BEGIN TRANSACTION
		IF LEN(@Mobile) <= 10 OR (LEN(@Mobile) >=10 )
			PRINT 1
			INSERT  INTO Media_QA.Multimedia.SMS
					( fkEntityID ,
						C_EntityType ,
						Mobile ,
						Message ,
						ScheduledDateTime ,
						DateCreated ,
						fkProjectID
					)
					SELECT  @EntityID ,
							776 , --Policy
								@Mobile,
							@Message ,
							@ScheduleDateTime ,
							@DateCreated ,
							@ProjectID
						
						
	COMMIT TRANSACTION
END TRY
BEGIN CATCH 
	IF @@TRANCOUNT > 0 
            ROLLBACK TRANSACTION; 

	RAISERROR ('Invalid Mobile: Mobile number must be 10 digits', 16,2 )
END CATCH; 

最后,正如 @Dave 提到的,您的 SP 首先不需要事务,因为单个插入已经是原子的。 您需要更好地了解交易。

让我们修改您的 SP,进行必要的更正。

SQL
CREATE OR ALTER  PROCEDURE [dbo].[SendSMS_TestMark]
    @EntityID INT , --PolicyID
    @Mobile VARCHAR(11) ,
    @Message VARCHAR(480) ,--What Needs to be send Text
    @ScheduleDateTime DATETIME , --Same date sync
	@DateCreated DATETIME, --Same date sync
    @ProjectID INT -- ClaimType and message type 
AS
BEGIN
	IF LEN(@Mobile) = 10
	BEGIN
		INSERT  INTO Media_QA.Multimedia.SMS
					( fkEntityID ,
					  C_EntityType ,
					  Mobile ,
					  Message ,
					  ScheduledDateTime ,
					  DateCreated ,
					  fkProjectID
					)
					SELECT  @EntityID ,
							776 , --Policy
							 @Mobile,
							@Message ,
							@ScheduleDateTime ,
                        @DateCreated ,
                        @ProjectID
	END
	ELSE
	BEGIN
		RAISERROR ('Invalid Mobile: Mobile number must be 10 digits', 16,2 );
	END
END

コメント

タイトルとURLをコピーしました