2017-06-09 4 views
1

Wenn ich diese gespeicherte Prozedur ausgeführt habe, kann ich nicht in IF Block Rollback selbst die IF Aussage war richtig. Wenn die Anweisung IF richtig war, wird das Skript am Ende noch ausgeführt, und es gibt überhaupt kein Rollback.Kann nicht zurücksetzen, wenn block transaction sql

Die Botschaft: Der Account-ID wurde bereits erfolgreich Register

Msg 3902, Ebene 16, Status 1, Prozedur PROC_DANGKY, Zeile 23
Die COMMIT TRANSACTION-Anforderung hat entsprechende kein BEGIN TRANSACTION verwendet.

Code:

CREATE PROCEDURE PROC_REGISTER 
    @name nvarchar(30), 
    @birth datetime, 
    @passport nvarchar(9), 
    @address nvarchar(50), 
    @phone nvarchar(11), 
    @email nvarchar(20), 
    @account nvarchar(30), 
    @password nvarchar(20) 
AS 
BEGIN TRAN 
    BEGIN TRY 
     IF (EXISTS(SELECT * FROM CUSTOMER WHERE ACCOUNT = @account))  
     BEGIN    
      PRINT N'The account id has already been used' 
      ROLLBACK TRAN    
     END  

     INSERT INTO KHACHHANG 
     VALUES (@name, @birth, @passport, @address, @phone, @email, @account, @password) 
     PRINT N'Successfully registered' 
    END TRY 
    BEGIN CATCH 
     DECLARE @ErrorMsg VARCHAR(2000) 
     SELECT @ErrorMsg = N'Error: ' + ERROR_MESSAGE() 
     RAISERROR(@ErrorMsg, 16,1) 

     ROLLBACK TRAN 

     RETURN 
    END CATCH 
COMMIT TRAN 
+0

Sie nichts zu tun, wenn Sie für VORHANDEN überprüfen, so müssen Sie nicht zurück rollen und nach Einsatz Sie begehen und nicht von außen – maSTAShuFu

Antwort

1

UMGE Ihre Anfrage


entfernt Rollback besteht nach

CREATE PROC PROC_REGISTER 
    @name nvarchar(30), 
    @birth datetime, 
    @passport nvarchar(9), 
    @address nvarchar(50), 
    @phone nvarchar(11), 
    @email nvarchar(20), 
    @account nvarchar(30), 
    @password nvarchar(20) 

AS 
BEGIN TRAN  
    BEGIN TRY 
     IF (EXISTS(SELECT * FROM CUSTOMER WHERE ACCOUNT = @account))  
      PRINT N'The account id has already used' 
     ELSE 
     BEGIN 

      INSERT INTO KHACHHANG VALUES (@name, @birth, @passport,   @address, @phone, @email, @account, @password) 
      PRINT N'Successul register' 
     END 
    END TRY 
    BEGIN CATCH 
     DECLARE @ErrorMsg VARCHAR(2000) 


      SELECT @ErrorMsg = N'Error: ' + ERROR_MESSAGE() 
      RAISERROR(@ErrorMsg, 16,1) 
      IF @@TRANCOUNT > 0 
        ROLLBACK TRAN 
     END CATCH 

IF @@TRANCOUNT > 0 
    COMMIT TRAN 
GO 

RETURN 
+0

Uh ... Dies würde Fehler (aufgrund fehlender commit) wenn die 'IF' Bedingung wahr ist. Es gibt keinen Grund, das Commit in einen IF/ELSE-Block zu setzen, wenn BEGIN TRAN nicht ebenfalls in diesem Block ist. – ZLK

+0

mein Skript aktualisiert – maSTAShuFu

0

Sie @@TRANCOUNT überprüfen können, bevor Rollback wenn tr ckeck ansaction existiert:

CREATE PROC PROC_REGISTER 
    @name nvarchar(30), 
    @birth datetime, 
    @passport nvarchar(9), 
    @address nvarchar(50), 
    @phone nvarchar(11), 
    @email nvarchar(20), 
    @account nvarchar(30), 
    @password nvarchar(20) 

AS 
BEGIN TRAN 
    BEGIN TRY 
     IF (EXISTS(SELECT * FROM CUSTOMER WHERE ACCOUNT = @account))  
      BEGIN    
       PRINT N'The account id has already used' 
       IF (@@TRANCOUNT > 0) 
       BEGIN 
        ROLLBACK TRAN 
       END 
      END  
     INSERT INTO KHACHHANG VALUES (@name, @birth, @passport, @address, @phone, @email, @account, @password) 
     PRINT N'Successul register' 
    END TRY 
    BEGIN CATCH 
     DECLARE @ErrorMsg VARCHAR(2000) 
     SELECT @ErrorMsg = N'Error: ' + ERROR_MESSAGE() 
     RAISERROR(@ErrorMsg, 16,1) 
     IF (@@TRANCOUNT > 0) 
     BEGIN 
      ROLLBACK TRAN 
     END 
     RETURN 
    END CATCH 
COMMIT TRAN 
Verwandte Themen