2012-10-22 28 views
2

如何修改以下過程,如果插入語句由於PrimaryKey而未能成功執行,或者Delete語句也必須不被執行,並且還應該生成一條錯誤消息,表明我將寫入我。使用事務

CREATE PROCEDURE [dbo].[ReAdmissionInsert] 
@GRNo varchar(4), 
@ClassId numeric(2), 
@FacultyId numeric(1), 
@Section varchar(1), 
@SessionId numeric(1) 
AS 
begin 
insert into ReAdmissionDtl(GRNo,ClassId,FacultyId,Section,SessionId) values(@GRNo,@ClassId,@FacultyId,@Section,@SessionId) 
delete from Discharge where GRNo = @GRNo 
end 

回答

1

使用事務和try catch塊。舉起你的錯誤在catch塊,像這樣:

CREATE PROCEDURE [dbo].[ReAdmissionInsert] 
@GRNo varchar(4), 
@ClassId numeric(2), 
@FacultyId numeric(1), 
@Section varchar(1), 
@SessionId numeric(1) 
AS 
begin 
Begin transaction 
Begin try 
    insert into ReAdmissionDtl(GRNo,ClassId,FacultyId,Section,SessionId) 
     values(@GRNo,@ClassId,@FacultyId,@Section,@SessionId) 
    delete from Discharge where GRNo = @GRNo 
    Commit transaction 
End try 
Begin catch 
    Rollback 
    Raiserror(999999,'my message',16,1) 
End catch 
end 
+0

非常感謝它的工作......我如何插入從表中選擇錯誤消息的值。如果我想設置我的錯誤消息像這樣'我的錯誤消息'+從mytable中選擇mycolumn現在mycolumnvalue ='myvalue'現在假設如果選擇的值是myvalue比錯誤消息應該是這樣的。 '我的錯誤信息myvalue'我不知道我是否願意清除我想要或不想要的東西。但可能你明白我在說什麼 – kashif

2

您使用BEGIN TRAN & COMMIT創建是否會被回滾事務的INSERTDELETE失敗:

CREATE PROCEDURE [dbo].[Readmissioninsert] @GRNo  VARCHAR(4), 
              @ClassId NUMERIC(2), 
              @FacultyId NUMERIC(1), 
              @Section VARCHAR(1), 
              @SessionId NUMERIC(1) 
AS 
    BEGIN 
     BEGIN TRAN --<= Starting point of transaction 

     INSERT INTO readmissiondtl 
        (grno, 
        classid, 
        facultyid, 
        section, 
        sessionid) 
     VALUES  (@GRNo, 
        @ClassId, 
        @FacultyId, 
        @Section, 
        @SessionId) 

     DELETE FROM discharge 
     WHERE grno = @GRNo 

     COMMIT --<= End point of transaction 
    END 

Documentation

您可以使用該錯誤消息TRY CATCH

+0

怎麼樣的錯誤信息? – kashif

+0

@kashif看我的編輯。 – Kermit

+0

我已經應用了您的代碼,但這不起作用。當我通過插入語句輸入重複值時,它給出違反主鍵的錯誤,而從給定GRNo的放電錶中記錄正在被刪除 – kashif

1

存儲過程的事務寫作的SQL Server 最佳實踐 -

  1. 附上withing TRY..CATCH
  2. 檢查@@TRANCOUNTROLLBACK交易on ERROR
  3. RAISE實際ERROR給報警調用程序

樣本 -

CREATE PROCEDURE [dbo].[ReAdmissionInsert] 
@GRNo varchar(4), 
@ClassId numeric(2), 
@FacultyId numeric(1), 
@Section varchar(1), 
@SessionId numeric(1) 
AS 
BEGIN 
SET NOCOUNT ON 
BEGIN TRY 
    BEGIN TRAN 

    insert into ReAdmissionDtl(GRNo,ClassId,FacultyId,Section,SessionId) 
     values(@GRNo,@ClassId,@FacultyId,@Section,@SessionId) 

    delete from Discharge where GRNo = @GRNo 

    COMMIT TRAN  
END TRY  
BEGIN CATCH 

    IF @@TRANCOUNT > 0 
     ROLLBACK TRAN 

    /*ERROR OCCURED*/ 
    DECLARE @ERROR_MESSAGE NVARCHAR(4000);--MESSAGE TEXT   
    DECLARE @ERROR_SEVERITY INT;--SEVERITY   
    DECLARE @ERROR_STATE INT;--STATE   

    SELECT @ERROR_MESSAGE = ERROR_MESSAGE(),   
     @ERROR_SEVERITY = ERROR_SEVERITY(),   
     @ERROR_STATE = ERROR_STATE() 


    /*RETURN ERROR INFORMATION ABOUT THE ORIGINAL ERROR THAT CAUSED 
     EXECUTION TO JUMP TO THE CATCH BLOCK.*/   
    RAISERROR (@ERROR_MESSAGE, @ERROR_SEVERITY, @ERROR_STATE) 

END CATCH 
END 

注意@@TRANCOUNT進行檢查,以確認是否有任何打開的事務和ERROR消息的保留和提升,從而程序會收到SqlException