2011-08-15 30 views
0

有没有办法让程序在所有过程中搜索和替换特定的字符串?在SQL Server中的过程中替换字符串

+0

请多一些信息。你是否试图搜索每个表格或特定字段的每个字段? – Marc

+0

我试图替换SQL存储过程中与软件本身互动的评论,但有太多的程序手动执行它,一个接一个 –

+2

因此,您试图批量更新存储过程定义,然后不是用户表内容? –

回答

2

也许修复应用程序会更容易。为什么软件关心评论?它是否也扩展属性barf?

假设注释始终是相同的,在Management Studio与运行结果这个文本:

SET NOCOUNT ON; 

SELECT 'GO 
    ' + REPLACE([definition], '/* offending comment */', '') 
    FROM sys.sql_modules 
    WHERE [definition] LIKE '%/* offending comment */%'; 

这将产生一系列由GO分离CREATE PROCEDURE命令。如果在存储过程主体中有实际的CREATE PROCEDURE字符串,则您无需为CREATE PROCEDURE进行搜索/创建并将其更改为ALTER。因此,你可以拉这些结果到你喜欢的文本编辑器,并做了搜索和替换为:

GO 
CREATE PROCEDURE 

与替换它:

GO 
ALTER PROCEDURE 

(虽然这个假设你没有意见CREATE PROCEDURE前行如果你这样做,你会如果你不需要担心包含一个有效的字符串CREATE PROCEDURE程序需要得到您更多的创意和替换)

- 一个d假设你的语法实际上是CREATE PROCEDURE,而不是CREATE PROCCREATEPROC之间和你的系统不区分大小写,您使用create procCreate Proc随机间距......

SET NOCOUNT ON; 

SELECT 'GO 
    ' + REPLACE(REPLACE([definition], '/* offending comment */', ''), 
    'CREATE PROCEDURE', 'ALTER PROCEDURE') 
    FROM sys.sql_modules 
    WHERE [definition] LIKE '%/* offending comment */%'; 

如果你不关心与您的存储过程相关的现有有形事物,例如权限,你也可以这样来做:

SELECT 'DROP PROCEDURE ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) + '; 
    ' + 'GO 
    ' + REPLACE([definition], '/* offending comment */', '') 
FROM sys.sql_modules 
WHERE [definition] LIKE '%/* offending comment */%'; 

这将生成一个脚本,更接近于准备走了,因为它只是下降的过程并重新创建它(所以并不需要改变CREATEALTER),但由于权限和/或依赖关系,您可以删除并重新创建对象的情况并不常见。

CREATE OR REPLACE或者类似的DDL会让这个脚本更容易编写出来。如果你觉得这将是一个有价值的除了SQL Server中,请投给了以下建议(并添加你的使用情况,或者为什么你认为这将是宝贵的,对评论):

http://connect.microsoft.com/SQLServer/feedback/details/127219/create-or-replace

+0

非常感谢您的解释!关于干扰的评论,其原因在于它不存在/不存在的一条线,并且由于我们正在讨论大量程序和线条,因此需要手动完成。 –

+0

哦,确认!谢谢亚伦伯特兰非常有用的脚本。我有一组存储过程在2个表上运行“更新统计信息”,我不得不改变他们说“更新统计信息与fullscan,列”。这(你的第二个)完成了我想做的事 - 生成ALTER脚本。与“sp_MSforEachDB”循环集成在一起! – NateJ

+0

不,请不要使用sp_msforeachdb:http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx –

0

如何关于将所有这些存储过程的脚本生成为.sql文件,然后在CTRL + H的帮助下替换该生成文件中的注释。难道不是更简单的选项吗?

+0

它可能是,但是如果有5,000个过程,并且只有150个过程包含注释...所以如果要将它限制为包含注释的过程(需要'WHERE'子句),为什么不添加'REPLACE ()'调用之前,你得到的输出? –

+0

我绝对看到你的观点。但是,如果我们通过向导生成它,脚本的格式保持不变。而如果我们运行自己的查询来获取此信息,我认为格式化会花费一些时间,我想知道它是否会混淆作者。如果所有的注释都在SP的开头,那应该没问题,但是如果我们想要替换那个SP中的特定代码块的注释呢? – vmvadivel

+0

为什么要格式化“折腾”?也许如果您将结果用于网格,但文本结果应该是准确的(只要没有一个过程长于最大文本输出)。至于评论的类型以及评论在程序主体中的位置,这两个都不重要,尽管我们不知道是由于缺乏问题的细节。 –