#sql #tsql #procedure
#sql #sql-сервер #sql-server-2005
Вопрос:
Я создал новую базу данных с копиями существующих таблиц, но изменил имена этих таблиц, есть ли SQL-скрипт, который я могу запустить (возможно, с помощью SysObjects), чтобы изменить все ссылки на эти таблицы во всех хранимых процедурах?
Комментарии:
1. Я предполагаю, что SQL Server упоминается
sysobjects
? Если да, то какая версия?2. Создайте сценарии для ваших хранимых процедур , а затем выполните поиск и замену для всех имен таблиц , которые вы изменили …
3. не запускайте команды ОБНОВЛЕНИЯ для системных таблиц!!!! выполните необходимые процедуры, внесите изменения (поиск / замена или вручную), а затем запустите сценарии!!!
4. НЕ ПОЛАГАЙТЕСЬ НА INFORMATION_SCHEMA.ROUTINES , потому
ROUTINE_DEFINITION
что толькоnvarchar(4000)
. Вам нужно использоватьsys.sql_modules
wheredefinition
isnvarchar(max)
. Посмотрите на мой ответ для примера запросов.
Ответ №1:
НЕ ПОЛАГАЙТЕСЬ НА INFORMATION_SCHEMA.ROUTINES, потому ROUTINE_DEFINITION
что только nvarchar(4000)
. Вам нужно sys.sql_modules
указать, где definition
находится nvarchar(max)
попробуйте любой из этих способов, чтобы найти процедуру, которую необходимо изменить:
SELECT DISTINCT
LEFT(s.name '.' o.name, 100) AS Object_Name,o.type_desc --, m.definition
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id=o.object_id
INNER JOIN sys.schemas s ON o.schema_id=s.schema_id
WHERE m.definition Like '%' @SearchValue '%'
ORDER BY 1
SELECT
OBJECT_SCHEMA_NAME(m.object_id) '.' OBJECT_NAME(m.object_id) --, m.definition
FROM sys.sql_modules m
WHERE m.definition like '%whatever%'
SELECT
OBJECT_SCHEMA_NAME(m.object_id) '.' OBJECT_NAME(m.object_id), o.type_desc
--,m.definition
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id=o.object_id
WHERE m.definition like '%whatever%'
вы можете раскомментировать m.definition
список содержимого, но я считаю, что лучше просто идентифицировать все процедуры, а затем просмотреть их вручную, потому что вы не хотите запускать команды обновления для системных таблиц. Выполните необходимые процедуры, внесите изменения (поиск / замена или вручную), а затем запустите сценарии!!!
Ответ №2:
Нет.
Я считаю, что рефакторинг SQL от Redgate обладает этой функциональностью. В противном случае вы могли бы создать сценарий для всех объектов и вручную или с помощью кода выполнить поиск и замену.
SQL Server 2005 также поддерживает синонимы, которые могут оказать некоторую помощь.
Комментарии:
1. Да, в SQL Refactor есть функция интеллектуального переименования, которая изменяет все ссылки переименованного объекта, как и SQL Prompt 5, который должен выйти очень скоро.
Ответ №3:
Вот фрагмент SQL, который можно использовать для получения определения хранимых процедур, соответствующих определенным критериям поиска. Вы могли бы просто изменить его, чтобы выполнить поиск и замену, как предложил Мартин.
Просто измените ‘% ИМЯ_ТАБЛИЦЫ%’ на ваши критерии поиска или имя таблицы, которое вы хотели бы изменить.
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%TABLE_NAME%' AND ROUTINE_TYPE='PROCEDURE'
Комментарии:
1. НЕ ПОЛАГАЙТЕСЬ НА INFORMATION_SCHEMA.ROUTINES , потому
ROUTINE_DEFINITION
что толькоnvarchar(4000)
. Вам нужно использоватьsys.sql_modules
wheredefinition
isnvarchar(max)
. Посмотрите на мой ответ для примера запросов.
Ответ №4:
Если это краткосрочно (например, тестовая база данных), более простым решением может быть создание a VIEW
для каждой таблицы, которую вы изменили, используя старое имя. Например, если вы изменили таблицу tests
на tests_new
вы можете сделать:
CREATE VIEW dbo.tests
AS
SELECT * FROM dbo.tests_new
Все ваши процедуры будут использовать эту ссылку dbo.tests
для фактического просмотра данных dbo.tests_new
.
Это очень, очень плохая идея, если это будет постоянная / производственная база данных, поскольку она просто добавляет слой запутывания в вашу структуру и сделает ее кошмаром для обслуживания.
Ответ №5:
Вы не можете изменить ссылки на таблицы в sprocs через системный словарь данных — вам нужно будет получить сценарий, который создает хранимую процедуру, и изменить имена таблиц в сценарии. Если у вас есть сценарии, по большей части это простой поиск и замена.
Если у вас нет скриптов, вы можете получить текст скриптов хранимых процедур из sys.sql_modules или получить его через SSMS.