Замена строки между процедурами в SQL Server - PullRequest
0 голосов
/ 16 августа 2011

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

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Может быть, было бы проще исправить приложение. Почему программное обеспечение заботится о комментариях? Это также влияет на расширенные свойства?

Предполагая, что комментарий всегда один и тот же, запустите его в Management Studio с результатами в текст:

SET NOCOUNT ON;

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

Это приведет к серии CREATE PROCEDURE команд, разделенных GO. Вы не можете обязательно выполнять поиск / создание для CREATE PROCEDURE и изменить его на ALTER, если в теле хранимой процедуры есть действительные строки CREATE PROCEDURE. Таким образом, вместо этого вы можете перетащить эти результаты в ваш любимый текстовый редактор и выполнить поиск и заменить:

GO
CREATE PROCEDURE

Замена на:

GO
ALTER PROCEDURE

(хотя это предполагает, что у вас нет комментариев до строки CREATE PROCEDURE. Если вы это сделаете, вам нужно будет проявить больше творчества с помощью поиска и замены.)

Если вам не нужно беспокоиться о процедурах, которые содержат действительную строку CREATE PROCEDURE - и при условии, что ваш синтаксис на самом деле CREATE PROCEDURE, а не CREATE PROC или случайный интервал между CREATE и PROC, и это ваша система не чувствительна к регистру, и вы использовали create proc или Create 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 */%';

Это сгенерирует скрипт, который гораздо ближе к готовности, так как он просто отбрасывает процедуру и заново ее создает (поэтому не нужно менять CREATE на ALTER), но он не очень Обычно вы можете просто отбрасывать и заново создавать объекты из-за разрешений и / или зависимостей.

CREATE OR REPLACE или что-то подобное в DDL сделало бы это намного проще в сценарии. Если вы считаете, что это будет ценным дополнением к SQL Server, проголосуйте за следующее предложение (и добавьте свой вариант использования или почему вы считаете, что это будет полезно в комментариях):

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

0 голосов
/ 16 августа 2011

Как насчет генерации сценариев ВСЕХ этих хранимых процедур в виде файла .sql с последующей заменой комментария в этом сгенерированном файле с помощью сочетания клавиш CTRL + H. Разве это не проще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...