2013-12-03 2 views
2

Как найти и заменить определенный текст в хранимой процедуре?SQL-запрос для поиска и замены текста в хранимой процедуре

У меня есть запрос на поиск и замену, но я не уверен, как отправить его обратно в хранимую процедуру или обновить хранимую процедуру с результатом запроса.

Вот запрос, который я использую для поиска и замены:

SELECT 
    REPLACE (object_definition(object_id('storedprocedure_1')), 'findstring', 'replacestring') 

ответ

0

Вы можете получить определение хранимой процедуры следующим образом:

use <your database> 
go 
select 
definition 
from 
sys.sql_modules 
where 
object_id = OBJECT_ID('<your schema.procedure_name>') 

Это возвращает фактическое определение указанной вами процедуры. Я думаю, вы можете составить список хранимых процедур и пройти через это. Не уверен, что я рекомендую попробовать их изменить в sys.sql_modules, но по крайней мере вы можете найти те, которые содержат текст, который вы ищете.

+0

Мне нужно будет обновить исходное определение, и это не одноразовая задача, она должна выполняться каждый раз при восстановлении базы данных. Именно по этой причине я хочу обновить всю процедуру через sql. Я могу добиться того же, что и объект хранимой процедуры .net (TextBody), но поскольку я обновляю около 200+ SP, это занимает около 25-30 минут. Поэтому я хочу взять SQL-маршрут, чтобы узнать, работает ли его более быстрый – JayJ

4
Declare @spnames CURSOR 
Declare @spname nvarchar(max) 
Declare @moddef nvarchar(max) 
Set @spnames = CURSOR FOR 
select distinct object_name(c.id) 
from syscomments c, sysobjects o 
where c.text like '%findtext%' 
and c.id = o.id 
and o.type = 'P'  
OPEN @spnames 
FETCH NEXT 
FROM @spnames into @spname 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    Set @moddef = 
    (SELECT 
    Replace ((REPLACE(definition,'findtext','replacetext')),'ALTER','create') 
    FROM sys.sql_modules a 
    JOIN 
    ( select type, name,object_id 
    from sys.objects b 
    where type in (
    'p' -- procedures 
    ) 
    and is_ms_shipped = 0 
    )b 
    ON a.object_id=b.object_id where b.name = @spname)    
    exec('drop procedure dbo.' + @spname) 
    execute sp_executesql @moddef 
    FETCH NEXT FROM @spnames into @spname 
END 

Это то, что я смог придумать, в настоящее время он выполняет замену текста и повторное создание хранимых процедур.

+0

за 1 час работы. –

Смежные вопросы