是否有一种简单的方法可以在我的SQL Server数据库中的每个视图和存储过程中对字符串进行查找和替换。 我需要用'X(UK)'替换像'X United Kingdom'这样的东西。
答案 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 ++”替换字符串。再次执行脚本。不是更好的方式,但适合我。 :)