Sql 使用事务更改程序

Sql 使用事务更改程序,sql,sql-server-2005,Sql,Sql Server 2005,我需要修改大约24个大型UDP,对于生产部署,我需要执行BEGIN TRANSACTION/ROLLBACK/COMMIT过程 如何在BEGIN TRANSACTION和COMMIT或ROLLBACK之间添加ALTER PROCEDURE my_proc 注意:EXEC('ALTER PROCEDURE..)可以不实施 谢谢 更新:有一种方法可以更改过程,并在失败时回滚?为什么不能使用常规方法 BEGIN TRANSACTION GO CREATE PROCEDURE testProcedur

我需要修改大约24个大型UDP,对于生产部署,我需要执行BEGIN TRANSACTION/ROLLBACK/COMMIT过程

如何在BEGIN TRANSACTION和COMMIT或ROLLBACK之间添加
ALTER PROCEDURE my_proc

注意
EXEC('ALTER PROCEDURE..)
可以不实施

谢谢


更新:有一种方法可以更改过程,并在失败时回滚?

为什么不能使用常规方法

BEGIN TRANSACTION
GO

CREATE PROCEDURE testProcedure
AS
    SELECT 1
GO

SELECT OBJECT_ID('testProcedure') ObjectID --this will return the object ID
GO

rollback TRANSACTION

SELECT OBJECT_ID('testProcedure') ObjectID  --this will return NULL because the proc creation was rolled back
GO
您不能有“开始尝试”和“开始捕获”两个批次。但是,您可以使用最后一批来检查前面的所有步骤是否成功(例如,通过检查目录视图,如
sys.objects
)。然后,您可以决定批处理是否全部成功并提交或回滚。

(Leandro,我添加了一个新的答案,因为它对于一个compent来说太长了)

我一直在想。我不认为这是我会实现的解决方案,但基于您的需求(特别是您的限制),这里有一个可行的想法:


sys.objects目录上有一个modify_日期,因此,为什么不在运行更新之前存储所有对象的日期,并与运行更新之后的日期进行比较呢。如果所有日期都不同,则表示所有日期都已正确更新;如果其中一个日期相等,则表示其中一个日期失败,然后运行回滚脚本(您需要回滚代码,只需键入rollback并不容易)

如果不能使用动态sql,则不能使用。对动态sql有什么限制?部署团队不能在Production下执行EXEC,那么您就不能这样做。时期动态SQL是您追求的唯一方法。
试试。。。CATCH
不能跨越批次,但OP没有提到
尝试。。。CATCH
无论如何。我不明白这个答案,我不想创建一个过程,我需要做一个alter过程。它也会失败,因为“CREATE/ALTER PROCEDURE”必须是查询批处理中的第一条语句。@Leandro:我想,迭戈代码片段中的
CREATE PROCEDURE…
只是一个例子,您可以使用
ALTER…
。至于您的另一点,此示例满足以下要求:
createprocedure
是第一条语句,因为它紧跟在批定界符
GO
之后。