2012-05-02 143 views
1

我有一个数据库,其中存储过程的数量是非常高的。但是有一些存储过程没有在存储过程级别启动事务。如何SQL Server存储在存储过程中的SQL语句

现在我想把交易,这些存储过程以自动方式。目前我正在使用PowerShell来执行此操作。

但问题是,我可以得到存储过程的定义,但我不能得到单个SQL语句在存储过程中,这样我可以写一些事务回滚/提交条件

例如,如果上述交易失败@@errorcount <> 0 then rollback

任何人都可以请让我知道如何做到这一点,还是有其他的方法来做到这一点?如果我可以分裂SQL语句(这是在存储过程中)我可以写在PowerShell的登录操作的存储过程

请帮

在此先感谢

+2

这听起来像一个非常糟糕的主意。我不会以编程方式执行此操作。编写能够决定放置这些语句的适当位置的逻辑非常困难。除此之外,最安全的方法是绑定到Visual Studio中的查询分析器引擎,并让它解析过程代码并将其分解为单独的语句。 –

+0

另外,你是如何从数据库中提取存储的proc代码?你不使用源代码控制系统? –

+0

在proc中添加大量的BEGIN TRAN-COMMIT TRAN逻辑通常会导致更多的阻塞,并可能导致命令超时和更频繁的死锁。如果COMMIT被遗漏在某个地方,那么交易可以保持开放并且不会被提交,直到通过某种方式(可能强行)关闭连接并且所完成的工作被丢弃并丢失。如果你正在编程创建新的'样板'CRUD程序,那将是一回事,但我必须投入第三次(第四次)投票。这不是你最好的主意。 –

回答

0

它们被存储为文本,所以要检查甚至改变身体的陈述,你需要一个parser。你可能会get somewhere使用也用于由Visual Studio(Microsoft.Data.Schema.ScriptDom.dllMicrosoft.Data.Schema.ScriptDom.Sql.dll),它可与您的Visual Studio安装,并且可以redistributed解析器。我目前正在使用它们来检查某些SQL脚本是否包含任何“不允许的”SQL语句(当然,在我自己的上下文中不允许),它似乎工作。

有了这样说,我会通过@RobertLDavis所作的评论表示赞同,认为这可能不是那么容易,因为它的外观和更好的不自动完成。此外,你无论如何审查所有的变化。因此,你可能可以首先手动完成它们。