我可以回滚动态SQL在SQL Server / TSQL
-
13-09-2019 - |
题
我可以在事务中运行动态SQL和回滚使用EXEC:
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
将这个交易中的,并使用@@ ERROR exec语句后做回滚。
例如。代码
BEGIN TRANSACTION
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
IF @@ERROR != 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
ELSE
COMMIT TRANSACTION
如果有n个动态SQL语句和在正发生错误/ 2将所述第一1到((N / 2) - 1)语句被回滚
绕第一答案问题
@@错误不会最有可能拾取错误 这意味着它可能不会拿起错误,这意味着交易可能会犯?这违背了目的
TRY在SQL Server / CATCH 2005+ 是的,我使用SQL Server 2005,但之前没有使用过尝试捕捉 会做下面这样的伎俩
BEGIN TRANSACTION
BEGIN TRY
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
OR我看着一些例子的净
BEGIN TRY --Start the Try Block..
BEGIN TRANSACTION -- Start the transaction..
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRAN -- Transaction Success!
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN --RollBack in case of Error
RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)
END CATCH
解决方案
是。所述TXNs属于当前会话/连接和动态SQL使用相同的上下文。
然而,@@ ERROR不会最有可能拿起错误:状态有问题的语句之后立即进行检查。我会用try / catch语句,假设SQL Server 2005的+
编辑:TRY / CATCH应该工作确定
。其他提示
不要把我们对它的词,试图捕捉将工作,测试它自己。由于这是动态sql最容易做的事情是让第一条语句正确的(当然它mneeds到豆更新,插入或删除,或者没有必要atransaction),然后做出深思熟虑的语法错误在第二statment。然后测试该更新插入或在第一statment删除经历。
我也想指出的是,动态SQL的规则是一个贫穷的做法。这是否真的需要是动态的?
不隶属于 StackOverflow