在 MS SQL Server Management Studio 中处理事务的最佳方式
Posted
技术标签:
【中文标题】在 MS SQL Server Management Studio 中处理事务的最佳方式【英文标题】:Best way to work with transactions in MS SQL Server Management Studio 【发布时间】:2010-10-05 03:07:58 【问题描述】:假设我有一个语法和语义正确的 SQL 语句,因此它可以执行。
在 Management Studio(或任何其他查询工具)中,我如何测试 SQL 语句,如果我发现它们破坏了某些内容,则回滚(在单独的查询中?)
【问题讨论】:
【参考方案1】:最简单的做法是将你的代码包装在一个事务中,然后逐行执行每批 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
希望这会有所帮助,但如果您需要更多详细信息,请告诉我。
【讨论】:
嗨,谢谢。我在这里第一次看到@@TRANCOUNT,你能告诉我在回滚处理后“IF @@TRANCOUNT > 0 COMMIT TRANSACTION”会发生什么吗? @@TRANCOUNT 有什么价值?再次感谢。 在执行 ROLLBACK TRANSACTION 后,@@TRANCOUNT 被设置回 0。这样,COMMIT TRANSACTION 将不会被执行。见msdn.microsoft.com/de-de/library/ms187967.aspx【参考方案2】:我想补充一点,如果你处于测试模式,你也可以(如果你写的东西很复杂,应该)添加一个测试变量来回滚。然后你可以一次执行整个事情。我还经常添加代码来查看各种操作的前后结果,特别是如果它是一个复杂的脚本。
下面的例子:
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
【讨论】:
以上是关于在 MS SQL Server Management Studio 中处理事务的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
UTF-8 字符在 MS-SQL-Server 上的 INSERT 语句中发生更改
[MS SQL Server]SQL Server如何开启远程访问
如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行