Giả thử bạn có các bảng sau đây:
1 - HoaDon
- maHoaDon (PK)
- maKhachHang
- các trường khác
2 - HoaDonChiTiet
- maHoaDon (FK) với PK của HoaDon
- maKhachHang
- các trường khác
Yêu Cầu : Khi có đơn hàng mới, bạn cần phải nhập 1 dòng vào bảng HoaDon và 1 dòng vào bảng HoaDonChiTiet
Cách thức thực hiện phổ biến là sử dụng IDENTIY ở trường maHoaDon của bảng HoaDon, sau đó truy cập bảng HoaDon để lấy dữ liệu, rồi nhập vào bảng HoaDonChiTiet. Câu lệnh như sau:
insert into @HoaDon (maKhachHang, cacTruongKhac) values (@maKhachHang,@cacGiaTriKhac); insert into @HoaDonChiTiet (maHoaDon,maKhachHang,cacTruongKhac) select maHoaDon,maKhachHang,cacTruongKhac from @HoaDon where maHoaDon in (select max(maHoaDon) from @HoaDon);
Cách thức này có 2 nhược điểm lớn
1 - Hệ thống phải thực hiện thêm 1 bước là truy cập bảng HoaDon để lấy dữ liệu để nhập vào bảng HoaDonChiTiet.
2 - Với môi trường có nhiều người sử dụng, có thể bảng HoaDonChiTiet sẽ bị bỏ sót, tức bạn nhập vào bảng HoaDon 1 dòng nhưng bảng HoaDonChiTiet lại không có. (để tránh điều này bạn có thể sử dụng thêm tính biệt lập cho câu lệnh - tôi sẽ đề cập vào 1 dịp khác)
Cách thức tốt hơn là bạn sử dụng lệnh OUTPUT, câu lệnh như sau:
insert into @HoaDon (maKhachHang, cacTruongKhac) output inserted.maHoaDon, inserted.maKhachHang, inserted.cacTruongKhac into @HoaDonChiTiet (maHoaDon, maKhachHang, cacTruongKhac) values (@maKhachHang,@cacGiaTriKhac);
Với cách thức này, sau khi đã nhập vào bảng HoaDon, dữ liệu được nhập ngay vào bảng HoaDonChiTiet mà không qua bước trung gian nào. Đồng thởi nó bảo đảm tính nhất quán của dữ liệu, cả 2 bảng đều được nhập thành công hoặc cả 2 bảng đều không thành công.
OUTPUT có rất nhiều tiện ích, tôi sẽ đề cập vào những bài viết khác.
Sau đây là toàn bộ mã cho bạn chạy thử
declare @HoaDon table(maHoaDon int identity(1,1), maKhachHang int, cacTruongKhac int); declare @HoaDonChiTiet table(maHoaDon int, maKhachHang int, cacTruongKhac int); declare @HoaDonChiTiet1 table(maHoaDon int, maKhachHang int, cacTruongKhac int); declare @maKhachHang int, @cacGiaTriKhac int; set @maKhachHang = 1; set @cacGiaTriKhac = 2; insert into @HoaDon values(@maKhachHang,@cacGiaTriKhac); -- cach thuc thong thuong insert into @HoaDon (maKhachHang, cacTruongKhac) values (@maKhachHang,@cacGiaTriKhac); insert into @HoaDonChiTiet (maHoaDon,maKhachHang,cacTruongKhac) select maHoaDon,maKhachHang,cacTruongKhac from @HoaDon where maHoaDon in (select max(maHoaDon) from @HoaDon); -- cach thuc su dung OUTPUT insert into @HoaDon (maKhachHang, cacTruongKhac) output inserted.maHoaDon, inserted.maKhachHang, inserted.cacTruongKhac into @HoaDonChiTiet (maHoaDon, maKhachHang, cacTruongKhac) values (@maKhachHang,@cacGiaTriKhac); select * from @HoaDon; select * from @HoaDonChiTiet;
Không có nhận xét nào:
Đăng nhận xét