สมมติว่าฉันมีคำสั่ง SQL ที่ถูกต้องตามหลักไวยากรณ์และเชิงความหมายดังนั้นจึงดำเนินการ
ใน Management Studio (หรือเครื่องมือสืบค้นข้อมูลอื่น ๆ ) ฉันจะทดสอบคำสั่ง SQL ได้อย่างไรและถ้าฉันสังเกตเห็นว่ามีบางอย่างขัดข้องให้ย้อนกลับ (ในแบบสอบถามแยกต่างหาก)
สมมติว่าฉันมีคำสั่ง SQL ที่ถูกต้องตามหลักไวยากรณ์และเชิงความหมายดังนั้นจึงดำเนินการ
ใน Management Studio (หรือเครื่องมือสืบค้นข้อมูลอื่น ๆ ) ฉันจะทดสอบคำสั่ง SQL ได้อย่างไรและถ้าฉันสังเกตเห็นว่ามีบางอย่างขัดข้องให้ย้อนกลับ (ในแบบสอบถามแยกต่างหาก)
คำตอบ:
สิ่งที่ง่ายที่สุดที่ต้องทำคือห่อรหัสของคุณในธุรกรรมจากนั้นดำเนินการชุดรหัส T-SQL ทีละบรรทัด
ตัวอย่างเช่น,
Begin Transaction
-Do some T-SQL queries here.
Rollback transaction -- OR commit transaction
หากคุณต้องการรวมการจัดการข้อผิดพลาดคุณสามารถทำได้โดยใช้ TRY ... CATCH BLOCK หากเกิดข้อผิดพลาดขึ้นคุณสามารถย้อนกลับการเปลี่ยนผ่านภายในบล็อก catch ได้
ตัวอย่างเช่น:
USE AdventureWorks;
GO
BEGIN TRANSACTION;
BEGIN TRY
-- Generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
ดูลิงค์ต่อไปนี้สำหรับรายละเอียดเพิ่มเติม
http://msdn.microsoft.com/en-us/library/ms175976.aspx
หวังว่านี่จะช่วยได้ แต่โปรดแจ้งให้เราทราบหากคุณต้องการรายละเอียดเพิ่มเติม
ฉันต้องการเพิ่มจุดที่คุณสามารถทำได้ (และหากสิ่งที่คุณเขียนมีความซับซ้อน) ให้เพิ่มตัวแปรทดสอบเพื่อย้อนกลับหากคุณอยู่ในโหมดทดสอบ จากนั้นคุณสามารถดำเนินการทั้งหมดได้ในครั้งเดียว บ่อยครั้งที่ฉันเพิ่มโค้ดเพื่อดูผลลัพธ์ก่อนและหลังของการดำเนินการต่างๆโดยเฉพาะอย่างยิ่งถ้าเป็นสคริปต์ที่ซับซ้อน
ตัวอย่างด้านล่าง:
USE AdventureWorks;
GO
DECLARE @TEST INT = 1--1 is test mode, use zero when you are ready to execute
BEGIN TRANSACTION;
BEGIN TRY
IF @TEST= 1
BEGIN
SELECT *FROM Production.Product
WHERE ProductID = 980;
END
-- Generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
IF @TEST= 1
BEGIN
SELECT *FROM Production.Product
WHERE ProductID = 980;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0 AND @TEST = 0
COMMIT TRANSACTION;
GO