01/10/2018, 15:26

ROLL BACK khi xảy ra lỗi trong sql server

Cho em hỏi làm thể nào để khi nó lỗi thì nó roolback ngay lập tức. Hiện tại để làm điều đó em phải đặt lệnh kiểm tra lổi ngay sau các câu lệnh thay đổi database. nó hoạt động ổn nhưng nó lập lại như vậy thì dư quá. Em thử đặt nó trước commit thì nó không hoạt động ạ

GO
/****** Object:  StoredProcedure [dbo].[InsertTiecCuoiWithHoaDonAndCTMonAnAndCTDichVu]    Script Date: 4/17/2018 7:01:44 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[InsertTiecCuoiWithHoaDonAndCTMonAnAndCTDichVu]
	@maTiecCuoi varchar(6),
	@tenChuRe varchar(50),
	@tenCoDau varchar(50),
	@sdt varchar(13),
	@ngayCuoi date,
	@maCa int,
	@maSanh varchar(5),
	@soBan int,
	@soBanDT int,
	@tienCoc int,
	@ngayDatTiec date,
	@maHoaDon varchar(6),
	@ngayThanhToan date,
	@stringListMaMonAn varchar(max),
	@stringListGCMonAn varchar(max),
	@stringListDichVu varchar(max),
	@stringListSoLuongOfDL varchar(max),
	@successed bit output
AS
BEGIN TRAN
	INSERT INTO TiecCuoi(MaTiecCuoi, TenChuRe, TenCoDau, SoDienThoai, NgayCuoi, MaCa, MaSanh, SoBan,SoBanDuTru, TienCoc,NgayDatTiec)
			VALUES(@maTiecCuoi, @tenChuRe, @tenCoDau, @sdt, @ngayCuoi, @maCa, @maSanh, @soBan, @soBanDT, @tienCoc, @ngayDatTiec)
	IF @@ERROR <> 0
	BEGIN
		SET @successed = 0
		IF @@TRANCOUNT > 0
			ROLLBACK TRAN
		GOTO Error
	END
	INSERT INTO HoaDon(MaHoaDon,MaTiecCuoi, NgayThanhToan) VALUES (@maHoaDon,@maTiecCuoi,@ngayThanhToan)
	IF @@ERROR <> 0
	BEGIN
		SET @successed = 0
		IF @@TRANCOUNT > 0
			ROLLBACK TRAN
		GOTO Error
	END
	-- add mon an va dich vu
	DECLARE @tbSelectedMA table(id int IDENTITY(1,1), monAn varchar(4), ghiChu varchar(max))
	DECLARE	@tbSelectedDV table (id int IDENTITY(1,1), dichVu varchar(6), soLuong int)

	-- add CT mon an
	INSERT INTO @tbSelectedMA(monAn, ghiChu) 
		(Select tbMa.value,tbGC.value from string_split(@stringListMaMonAn,',') tbMa, string_split(@stringListGCMonAn,',') tbGC where tbMa.id=tbGC.id)

	DECLARE @index int =1, @len int = (select COUNT(*) from @tbSelectedMA), @maMonAn varchar(4), @ghiChu varchar(max)
	WHILE @index <= @len 
	BEGIN
		select @maMonAn=monAn, @ghiChu=ghiChu from @tbSelectedMA where id=@index
		SET @index = @index + 1
		INSERT INTO CTMonAn(MaTiecCuoi, MaMonAn, GhiChi) VALUES (@maTiecCuoi, @maMonAn, @ghiChu)
		IF @@ERROR <> 0
		BEGIN
			SET @successed = 0
			IF @@TRANCOUNT > 0
				ROLLBACK TRAN
			GOTO Error
		END
	END
	-- add CT dich vu
	INSERT INTO @tbSelectedDV(dichVu, soLuong) 
		(Select tbDV.value,tbSL.value from string_split(@stringListDichVu,',') tbDV, string_split(@stringListSoLuongOfDL,',') tbSL where tbDV.id=tbSL.id)
	SET @index = 1
	SET @len = (select COUNT(*) from @tbSelectedDV)
	DECLARE @maDichVu varchar(6), @soLuong int
	WHILE @index <= @len 
	BEGIN
		select @maDichVu=dichVu, @soLuong=soLuong from @tbSelectedDV where id=@index
		SET @index = @index + 1
		INSERT INTO CTDichVu(MaTiecCuoi, MaDV, SoLuong) VALUES (@maTiecCuoi, @maDichVu, @soLuong)
		IF @@ERROR <> 0
		BEGIN
			SET @successed = 0
			IF @@TRANCOUNT > 0
				ROLLBACK TRAN
			GOTO Error
		END
	END
COMMIT TRAN
Error:
Bài liên quan
0