【发布时间】:2011-05-25 12:04:04
【问题描述】:
我正在创建一个将在 MS SQL 服务器中运行的脚本。此脚本将运行多条语句并且需要是事务性的,如果其中一条语句失败,则整个执行将停止并回滚任何更改。
在发出 ALTER TABLE 语句以向表中添加列然后更新新添加的列时,我无法创建此事务模型。为了立即访问新添加的列,我使用 GO 命令执行 ALTER TABLE 语句,然后调用我的 UPDATE 语句。我面临的问题是我无法在 IF 语句中发出 GO 命令。 IF 语句在我的事务模型中很重要。这是我尝试运行的脚本的示例代码。另请注意,发出 GO 命令,将丢弃 @errorCode 变量,并且需要在使用前在代码中声明下来(这不在下面的代码中)。
BEGIN TRANSACTION
DECLARE @errorCode INT
SET @errorCode = @@ERROR
-- **********************************
-- * Settings
-- **********************************
IF @errorCode = 0
BEGIN
BEGIN TRY
ALTER TABLE Color ADD [CodeID] [uniqueidentifier] NOT NULL DEFAULT ('{00000000-0000-0000-0000-000000000000}')
GO
END TRY
BEGIN CATCH
SET @errorCode = @@ERROR
END CATCH
END
IF @errorCode = 0
BEGIN
BEGIN TRY
UPDATE Color
SET CodeID= 'B6D266DC-B305-4153-A7AB-9109962255FC'
WHERE [Name] = 'Red'
END TRY
BEGIN CATCH
SET @errorCode = @@ERROR
END CATCH
END
-- **********************************
-- * Check @errorCode to issue a COMMIT or a ROLLBACK
-- **********************************
IF @errorCode = 0
BEGIN
COMMIT
PRINT 'Success'
END
ELSE
BEGIN
ROLLBACK
PRINT 'Failure'
END
所以我想知道如何解决这个问题,发出 ALTER TABLE 语句以添加一列,然后更新该列,所有这些都在作为事务单元执行的脚本中。
【问题讨论】:
-
如果只执行 DDL,您的数据库将处于模棱两可或无法维持的状态?如果 DDL 失败,您不能先执行 DDL,然后再执行 DML,在 DML 上捕获任何错误?
-
谢谢蒂姆,你的目标是正确的!希望我也可以将您的评论作为解决方案投票。
标签: sql sql-server tsql transactions alter-table