Может быть, было бы проще исправить приложение. Почему программное обеспечение заботится о комментариях? Это также влияет на расширенные свойства?
Предполагая, что комментарий всегда один и тот же, запустите его в 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