假设我有一个语法和语义都正确的SQL语句,那么它会被执行。
在管理工具(或任何其他查询工具)中,如何测试SQL语句?如果我发现它们破坏了某些内容,该如何回退事务(在单独的查询中)?
注:SQL语句是指Structured Query Language(结构化查询语言),一种用于管理关系数据库系统的标准编程语言。假设我有一个语法和语义都正确的SQL语句,那么它会被执行。
在管理工具(或任何其他查询工具)中,如何测试SQL语句?如果我发现它们破坏了某些内容,该如何回退事务(在单独的查询中)?
注:SQL语句是指Structured Query Language(结构化查询语言),一种用于管理关系数据库系统的标准编程语言。最简单的方法是将你的代码放入一个事务中,然后逐行执行每个批次的T-SQL代码。
例如:
Begin Transaction
-Do some T-SQL queries here.
Rollback transaction -- OR commit transaction
如果您想要加入错误处理,可以使用 TRY...CATCH 块。如果发生错误,您可以在 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
请参阅以下链接以了解更多详细信息。
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