编辑所有视图和存储过程,查找并替换?

时间:2009-11-10 11:01:07

标签: sql sql-server database

是否有一种简单的方法可以在我的SQL Server数据库中的每个视图和存储过程中对字符串进行查找和替换。 我需要用'X(UK)'替换像'X United Kingdom'这样的东西。

4 个答案:

答案 0 :(得分:2)

您需要查看sysobjects和syscomments,视图文本和存储过程都在syscomments中。它们的类型V = View和P = Procedure在sysobjects中

/*Search Stored Procedure and View Text*/  
declare @searchString varchar(100)

SELECT @searchString = 'X United Kingdom' 

SELECT Distinct   
    SO.Name,  SC.[text]  
FROM   
    sysobjects SO (NOLOCK)  
    INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID  
        AND SO.Type IN ('P', 'V')  
        AND SC.Text LIKE '%' + @searchString + '%'

很遗憾,您无法更新系统目录:( 因此,唯一简单的方法是使用脚本生成器,然后在您喜欢的文本编辑器中搜索和重新创建。

编辑: 我发布了一个生成ALTER语句的脚本,但是删除了一个looong过程,并且不推荐使用syscomments等等。我取消了这部分答案。

答案 1 :(得分:2)

找到了一种自动执行此操作的方法,根据需要更改“o.type”(P = SQL 存储过程,U = 表(用户定义),V = 视图.. . 参考:https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-objects-transact-sql?view=sql-server-ver15 )

DECLARE @queryDef NVARCHAR(max)

WHILE EXISTS (
                    SELECT 1
                    FROM sys.sql_modules    sm 
                    JOIN    sys.objects  o ON sm.object_id = o.object_id 
                    WHERE   sm.definition LIKE '%TEXT_TO_REPLACE%' 
                    AND o.type = 'V'
            )
BEGIN
    
                                                                    -- TO ALTER THE VIEW AUTOMATICALLY                                          
    SET @queryDef = (   SELECT TOP 1 Replace (Replace (sm.definition, 'CREATE VIEW', 'ALTER VIEW'), 
                                            'TEXT_TO_REPLACE', 
                                            'NEW_TEXT') 

                        FROM sys.sql_modules    sm 
                        JOIN    sys.objects  o ON sm.object_id = o.object_id

                        WHERE   sm.definition LIKE '%TEXT_TO_REPLACE%'
                        AND     o.type = 'V')
    
    EXEC (@queryDef)

END

答案 2 :(得分:0)

在Management Studio中,您可以编写所有存储过程的脚本,并查看新查询窗口,然后在“查找和替换”对话框中选择“不区分大小写”和“使用正则表达式”

在“查找内容”中输入

SET QUOTED_IDENTIFIER {(ON|OFF)}\nGO[:b\n]+CREATE[:b\n]+{(PROC|VIEW)}

在“替换为”中输入

SET QUOTED_IDENTIFIER \1\nGO\nALTER \2

这将为所有存储过程和视图生成ALTER脚本。然后你可以用'X(英国)'做'X英国'的标准查找和替换并执行脚本。

答案 3 :(得分:-1)

我是这样做的:

SELECT distinct so.Name
from sysobjects as so 
inner join syscomments as sc 
on so.id = sc.id
AND so.Type = 'P'
AND sc.Text LIKE '%foo%'
ORDER BY so.Name

这里是查询以查找包含特定文本的存储过程。

创建数据数据库的备份。

稍后我使用management studio生成脚本“Drop and Create to”文件。并使用“Notepad ++”替换字符串。再次执行脚本。不是更好的方式,但适合我。 :)