Chúng tôi có một ứng dụng lớn chủ yếu được viết trong SQL Server 7.0, nơi tất cả các cuộc gọi cơ sở dữ liệu được lưu trữ thủ tục. Chúng tôi hiện đang chạy SQL Server 2005, cung cấp nhiều tính năng T-SQL hơn.Cách xử lý lỗi SQL Server T-SQL thực tiễn tốt nhất là gì?
Sau mỗi lần SELECT, INSERT, UPDATE và DELETE, @@ ROWCOUNT và @@ ERROR bị bắt vào biến cục bộ và được đánh giá cho các sự cố. Nếu có một vấn đề sau đây được thực hiện:
- lỗi thông số đầu ra thông điệp được thiết lập
- rollback (nếu cần thiết) được thực hiện
- thông tin được viết (INSERT) để đăng nhập bảng
- trở lại với một số lỗi, duy nhất cho quy trình này (dương tính nếu gây tử vong, âm tính là cảnh báo)
Tất cả đều không kiểm tra các hàng (chỉ khi nó được biết) và một số khác biệt với ít hoặc nhiều thông tin nhật ký/gỡ lỗi. Ngoài ra, logic hàng đôi khi được tách ra khỏi logic lỗi (trên các cập nhật trong đó một trường đồng thời được kiểm tra trong mệnh đề WHERE, các hàng = 0 có nghĩa là ai đó đã cập nhật dữ liệu). Tuy nhiên, đây là ví dụ khá chung chung:
SELECT, INSERT, UPDATE, or DELETE
SELECT @[email protected]@ERROR, @[email protected]@ROWCOUNT
IF @Rows!=1 OR @Error!=0
BEGIN
SET @ErrorMsg='ERROR 20, ' + ISNULL(OBJECT_NAME(@@PROCID), 'unknown')
+ ' - unable to ???????? the ????.'
IF @@TRANCOUNT >0
BEGIN
ROLLBACK
END
SET @LogInfo=ISNULL(@LogInfo,'')+'; '+ISNULL(@ErrorMsg,'')+
+ ' @YYYYY=' +dbo.FormatString(@YYYYY)
+', @XXXXX=' +dbo.FormatString(@XXXXX)
+', Error=' +dbo.FormatString(@Error)
+', Rows=' +dbo.FormatString(@Rows)
INSERT INTO MyLogTable (...,Message) VALUES (....,@LogInfo)
RETURN 20
END
Tôi đang tìm cách thay thế cách chúng tôi thực hiện điều này bằng T-SQL TRY-CATCH. Tôi đã đọc về cú pháp TRY...CATCH (Transact-SQL), do đó, không chỉ đăng một số tóm tắt về điều đó. Tôi đang tìm bất kỳ ý tưởng hay nào và cách tốt nhất để thực hiện hoặc cải thiện các phương pháp xử lý lỗi của chúng tôi. Nó không phải là Try-Catch, chỉ là bất kỳ việc sử dụng xử lý lỗi T-SQL nào tốt hay tốt nhất.
Tôi cảm thấy nó bỏ qua trên các công cụ SQL Server 2005, nhưng tuyệt vời anyway. Và phần còn lại của trang web của anh ấy. – gbn
Đối với SQL Server 2005+, hãy bắt đầu tại đây http://www.sommarskog.se/error_handling/Part1.html –