Tin tốt là một giao dịch trong SQL Server có thể kéo dài nhiều đợt (mỗi exec
được coi như một lô riêng biệt.)
Bạn có thể bọc EXEC
của mình câu lệnh trong BEGIN TRANSACTION
và COMMIT
nhưng bạn sẽ cần phải tiến thêm một bước và quay lại nếu có bất kỳ lỗi nào xảy ra.
Lý tưởng nhất là bạn muốn một cái gì đó như thế này:
BEGIN TRY
BEGIN TRANSACTION
exec( @sqlHeader)
exec(@sqlTotals)
exec(@sqlLine)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
BEGIN TRANSACTION
và COMMIT
Tôi tin rằng bạn đã quen thuộc với. BEGIN TRY
và BEGIN CATCH
về cơ bản có các khối để bắt và xử lý bất kỳ lỗi nào xảy ra. Nếu bất kỳ EXEC
nào của bạn câu lệnh phát sinh lỗi, quá trình thực thi mã sẽ chuyển đến CATCH
khối.
Mã xây dựng SQL hiện tại của bạn phải nằm ngoài giao dịch (ở trên) vì bạn luôn muốn giữ cho các giao dịch của mình càng ngắn càng tốt.