Создание множественного и отфильтрованного удаления + Создание хранимых процедур
-
06-07-2019 - |
Вопрос
У меня есть этот сценарий:
select name,create_date,modify_date from sys.procedures order by modify_date desc
Я могу видеть, какие процедуры были изменены в последнее время.Я добавлю "где modify_date >= " И я хотел бы использовать какую-нибудь системную хранимую процедуру, которая сгенерирует меня :удаление + создание сценариев для (скажем, 5 совпадающих) хранимых процедур
Могу ли я как-то это сделать?
Спасибо
ОК.у меня есть окончательная версия:
http://swooshcode.blogspot.com/2008/10/generate-stored-procedures-scripts-for.html
вы, ребята, очень помогли
Спасибо
Решение
Это некрасиво, но это работает.Запустите вывод из него вручную или выполните его с помощью sp_executesql.
SELECT OBJECT_DEFINITION(object_id), 'drop procedure [' + name + ']'
FROM sys.procedures
WHERE modify_date >= @date
Вам также придется беспокоиться о потерянных правах.
Другие советы
Курсор не требуется (измените по желанию для схем и т.д.):
DECLARE @dt AS datetime
SET @dt = '10/1/2008'
DECLARE @sql AS varchar(max)
SELECT @sql = COALESCE(@sql, '')
+ '-- ' + o.name + CHAR(13) + CHAR(10)
+ 'DROP PROCEDURE ' + o.name + CHAR(13) + CHAR(10)
+ 'GO' + CHAR(13) + CHAR(10)
+ m.definition + CHAR(13) + CHAR(10)
+ 'GO' + CHAR(13) + CHAR(10)
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
ON m.object_id = o.object_id
INNER JOIN sys.procedures AS p
ON m.object_id = p.object_id
WHERE p.modify_date >= @dt
PRINT @sql -- or EXEC (@sql)
Вы могли бы использовать курсор для перебора каждой записи:
DECLARE @spName NVARCHAR(128)
DECLARE myCursor CURSOR FOR SELECT name FROM sys.procedures ORDER BY modify_date DESC
OPEN myCursor
FETCH NEXT FROM myCursor INTO @spName
WHILE @@fetch_status = 0
BEGIN
-- Process each stored procedure with a dynamic query
PRINT @spName
FETCH NEXT FROM myCursor INTO @spName
END
CLOSE myCursor
DEALLOCATE myCursor
тем временем я немного покопался, и, похоже,
sp_helptext 'my_stored_procedure'
это то, что мне нужно (плюс та часть, которую я уже знал, когда задавал вопрос, подробнее объясненный jdecuyper)
Лучше всего это сделать на более подходящем языке, чем SQL.Несмотря на его многочисленные расширения, такие как T-SQL, PL / SQL и PL / pgSQL, SQL не является лучшим решением для этой задачи.
Вот ссылка на аналогичный вопрос и мой ответ, который заключался в использовании SQL-DMO или SMO, в зависимости от того, есть ли у вас SQL 2000 или 2005.